Project Group - 21¶

Members: Eva Lijnen, Chaja Swab, Willemijn Dietz, Veerle van Citters, Noa Zijlmans

Student numbers: 4570812, 4661753, 5868130, 5871026, 4957024

Research Objective¶

The objective of this research is to gain insight into the effects of COVID-19 on the air passenger transport in The Netherlands. The COVID-19 pandemic has severely impacted society globally. To stop the spread and minimise the effects of the virus, borders were closed, affecting air traffic activity. This resulted in the following research question:

Research Question¶

How did COVID-19 affect the passenger air traffic in the Netherlands?

To answer this question properly, a number of sub-questions has been drawn up:

Subquestion 1

How has the number of new Covid-19 cases developed in the considered time in the Netherlands?

Hypothesis: It is expected that the number of Covid infections is dependent on seasonality and the regualtions in place.

Subquestion 2

How has the number of air traffic passengers developed in the considered time in the Netherlands?

Hypothesis: It is expected that the number of passengers is dependent on the governmental regulations in place. In times of strict regulations, it is expected that the number of air passengers is low. When Covid-19 measurements were low, it is expected that the number of passengers is broadly comparable to the number of passengers before Covid-19.

Subquestion 3

Are there relative differences in the development of air traffic passengers between the considered airports in the Netherlands?

Hypothesis: Tt is expected that airports with a relatively high number of local flights will ultimately have been affected the least, as they are less dependent on restrictions related to international travel. According to the database, Groningen Airport Eelde operates most local flights and therefore would be expected to be least affected by the restrictions overall.

Subquestion 4

How has COVID-19 impacted air traffic from and to various regions / continents?

Hypothesis: It is expected that number of air passengers on intercontinental flights has been more affected than the number of air passengers on European flights.

Scope of the research¶

Time scope: January 2018 - August 2022 2018 is considered to be the base case scenario. The impact of COVID-19 on the number of passenger is measured by comparing a given month in the pandemic with the corresponding month in the base case scenario.

Spatial scope: All passengers related to the following airports in The Netherlands fall inside the research scope: Amsterdam Airport Schiphol, Rotterdam The Hague Airport, Eindhoven Airport, Maastricht Aachen Airport and Groningen Airport Eelde. It has been decided to consider the number of passenger instead of flights. The reasoning behind this is that the number of flights might not be representative as airlines operated empty flights in order to keep their airport slot during COVID-19 (NOS, 2022).

Definitions: As stated in the reasearch question, only passenger air traffic is considered; cargo and mail air traffic fall outside the scope of this research. Moreover, the hypothesis is that mail and cargo air traffic have been less affected by COVID-19. As previously stated, passenger air traffic is measured in number of passenger (not in number of flights).

Air Traffic Related COVID-19 Regulations¶

This sections provides an overview of important COVID-19 regulations regarding air traffic between February 2020-May 2022 (Ministerie van Algemene Zaken, 2022). An extensive overview of the relevant regulations can be found in the Appendix.

  • February 2020: first COVID-19 infection in the Netherlands, increase in infections in Netherlands and the rest of Europe.
  • Begin March 2020: more infections in the Netherlands, first regulations on flights: temporary ban on passenger flights from risk areas (Italy, China, South Korea, and Iran).
  • Mid-March 2020: no-fly zone to the BES-island and the following countries: UK, Norway, Switzerland, Iceland, and border closure for people from out of Europe.
  • Begin of April 2020: only a limited number of flights are taking place, mostly repatriation flights, mandatory health certificate for all travelers coming from high-risk areas.
  • Mid-June 2020: Extension mandatory health certificate for all travelers coming from high-risk areas, mandatory face masks for passenger flights, extension ban on flights from out of Europe, possible to travel within Europe again.
  • Begin July 2020: ban for travelers from the following countries: Algeria, Australia, Canada, Georgia, Japan, Montenegro, Morocco, New Zealand, Rwanda, Serbia, South Korea, Thailand, Tunisia, Uruguay.
  • August-November 2020: it is still discouraged to travel to red/ orange-colored countries, call for only necessary trips.
  • March, April 2021: Allowed again to travel to the UK, flight bans on air traffic from South Africa, Dominican Republic, Brazil, Argentina, Bolivia, Chile, Colombia, Ecuador, French Guiana, Guyana, Panama, Paraguay, Peru, Suriname, Uruguay, and Venezuela.
  • June 2021: air traffic from above mentioned countries is possible again.
  • July 2021: possible to travel within EU with negative test result, vaccination, or proof of recovery
  • End of 2021: ban on flights from South Africa, Lesotho, Eswatini, Botswana, Namibia, and Zimbabwe, because of the Omicron variant of COVID-19.
  • End December 2021: lifting of ban on flights to the above-mentioned countries.
  • February 2022: necessary corona certificate, based on a vaccination/ recovery and modified rules for travelers to the Netherlands from an EU/Schengen country, traveling to countries outside Europe is no longer disallowed.
  • March- May 2022: most of the regulations are withdrawn.

Data Pipeline¶

In [1]:
## Here al the necessairy libary's are imported 

%matplotlib notebook


from urllib.request import urlopen
from plotly.offline import init_notebook_mode
import plotly.express as px
import plotly.graph_objects as go
import json
import pandas as pd
import numpy as np
import itertools
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import plotly.io as pio
#import geopandas as gpd
from plotly.graph_objs import *

##The first datafile is loaded in here 

filepath = '/Users/zijlm/Project-TIL6022-Group-21/Monthly_figures_on_aviation_10102022_111323.csv'
#filepath = '/Users/evalijnen/Documents/Python/Monthly_figures_on_aviation_10102022_111323.csv'

airtraffic_df = pd.read_csv(filepath, sep=";")

Data preparation subquestion 1¶

Filtered and prepared the data. Use of new_cases_smoothed --> justification based on source. New cases smoothed is used so the cases are on the rightful days instead of the information processing delay Only Covid-19 measurements that have a direct impact on travelling, have been considered in this subquestion.

In [2]:
# Import world Covid Data

filepath2 = '/Users/zijlm/Project-TIL6022-Group-21/owid-covid-data.csv'
covid_world_df = pd.read_csv(filepath2, sep=",")


# Convert date column into datetime format
covid_world_df['date'] = pd.to_datetime(covid_world_df['date'], 
                                        format='%Y-%m-%d %H:%M:%S')
covid_world_df


# Preparing the full data set for further use
# Filtering on Covid new cases for the Netherlands
covid_nl_total_df = covid_world_df[
                                    covid_world_df['location'] == 'Netherlands'
]


# Filtering for relevant columns and dropping NAN cells
covid_nl_df = covid_nl_total_df.iloc[:, [2,3,6]]
covid_nl_clean_df = covid_nl_df.dropna()
covid_nl_clean_df
Out[2]:
location date new_cases_smoothed
139328 Netherlands 2020-03-03 5.429
139329 Netherlands 2020-03-04 11.714
139330 Netherlands 2020-03-05 18.143
139331 Netherlands 2020-03-06 26.000
139332 Netherlands 2020-03-07 36.429
... ... ... ...
140268 Netherlands 2022-09-29 1751.857
140269 Netherlands 2022-09-30 2200.857
140270 Netherlands 2022-10-01 2200.857
140271 Netherlands 2022-10-02 2200.857
140272 Netherlands 2022-10-03 2200.571

945 rows × 3 columns

Subquestion 1 - How has the number of new COVID-19 cases developed in the considered time in the Netherlands?¶

In January 2020, the House of Representatives in the Netherlands was informed about the first COVID-19 infection in Wuhan in China (Ministerie van Algemene Zaken, 2022). The virus started spreading quite quickly to the rest of the world, and by the end of January the first cases in Italy were already detected. From now on, it was only a matter of time before the first infection in the Netherlands would be detected. Since the lack of knowledge of the virus and the degree of impact it had on people’s health, governments came together to take swift action.

The graph below shows the development of the reported new COVID-19 cases in the Netherlands in the period March 2020 to September 2022. The data is collected from OurWorldInData.org (Mathieu et al, 2020). Due to lack of test availability, there is no data available for the month February and therefore this has been left out of the scope. Although the hypothesis is that there have been some cases by then. The data is measured by day and will therefore be shown per day. Due to the slight delay in testing and test results, the data is smoothed over the days and therefore some numbers are given in decimals. In the graph, three types of dotted lines are shown, these lines indicate whether the government was taking measures or not. This data is collected from RIVM (Tijdlijn Van Coronamaatregelen, n.d.).

The hypothesis is that the number of new cases is mainly dependent on the seasonality and the active regulations. It is expected that the number of infections is higher in winter than in summer. Additionally, it is assumed that measures taken by the government will impact the number of infections in terms of steepness of the slopes and eventually will cause the peaks to become lower, especially when it comes to introducing a (partial) lockdown.

In [3]:
# The figure is scaled for the max and the min value of the new cases smoothed
# New cases smoothed is used so the cases are on the rightful days instead of the information processing delay
dmax = covid_nl_clean_df['new_cases_smoothed'].values.max()
dmin = covid_nl_clean_df['new_cases_smoothed'].values.min()
fig = go.Figure()


# Figure contains lineplot of the new covid cases in NL
# The following hover data is added to each line: date and number of new cases 
fig.add_trace(go.Scatter(x=covid_nl_clean_df.date, 
                         y=covid_nl_clean_df['new_cases_smoothed'], 
                         mode='lines', name='New Covid Cases NL', 
                         hovertemplate='Date: %{x: "%m/%d/%Y}'+'<br>New Cases: %{y: "%m/%d/%Y}'))


# Multiple vertical lines indicating a significant change in Covid measurements
# Measurements considered: (partial) lockdown and easening of measurements
# The line color indicates the type of measurement 
# Same type of measurements are grouped in the legend
# The following hover data is added to each line: date and number of new cases 
fig.add_trace(go.Scatter(x=['2020-03-15','2020-03-15'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='red', width=2, dash='dash'),
                         legendgroup='Lockdown', name='Lockdown', 
                         hovertemplate='Date: %{x: "%m/%d/%Y}'))

fig.add_trace(go.Scatter(x=['2020-12-14','2020-12-14'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='red', width=2, dash='dash'),
                         legendgroup='Lockdown', name='Lockdown', 
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2021-12-19','2021-12-19'], 
                        y=[dmin,dmax], mode='lines', 
                        line=dict(color='red', width=2, dash='dash'),
                        legendgroup='Lockdown', name='Lockdown', 
                        hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2020-10-10','2020-10-10'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='orange', width=2, dash='dash'),
                         legendgroup='Partial Lockdown', name='Partial Lockdown',
                         hovertemplate='Date: %{x: "%m/%d/%Y}'))                         

fig.add_trace(go.Scatter(x=['2020-06-01','2020-06-01'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}'))

fig.add_trace(go.Scatter(x=['2021-06-26','2021-06-26'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
                        
fig.add_trace(go.Scatter(x=['2021-02-08','2021-02-08'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2022-01-10','2022-01-10'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures', 
                         hovertemplate ='Date: %{x: "%m/%d/%Y}', showlegend=False))         


# The figure is updated with titles and a legend is added
fig.update_layout(title='New Covid Cases in the Netherlands', 
                  xaxis_title='Date', yaxis_title='New Cases Smoothed')                                                 
fig.update_layout(legend=dict(groupclick='toggleitem'))
fig.layout.plot_bgcolor='#f0f5f5'
fig.show()

From the graph, it becomes clear that the governments took measures in times of a steep increase in new COVID-19 cases. As a result, the peaks took place in a short period of time after introducing a (partial) lockdown. Vice versa, measures were eased in times of a decreasing number of new cases. In January 2022 this resulted in a significant peak in the number of new cases. However, the number of hospitalizations did not increase and as such there was no reason to tighten the measures.

When looking at the seasons, it seems that as it gets colder outside, i.e. from October onwards, there are more new cases every year. Vice versa, when the temperature gets warmer, i.e. from May onwards, the number of new cases seems to decrease. However, in July 2021 there is a peak in new cases even though this is during midsummer. This can be explained by the fact that measures were eased quite quickly by that time because of the high vaccination rate. After the fast-growing number of new cases, the government decided to tighten the measures again.

Data preparation subquestion 2¶

In [4]:
# Convert Periods column to datetime
# This one needs to be uncommenten en then again ###
airtraffic_df['Periods'] = airtraffic_df['Periods'].str.replace('*', '')
airtraffic_df['Periods'] = pd.to_datetime(airtraffic_df['Periods'], format='%Y %B',
                                          errors='coerce') 

airtraffic_df['Periods']

# Select rows that fall within our timespan
at_df_timespan = airtraffic_df[airtraffic_df['Periods']>='2018-01-01']

at_df_timespan
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\1017535499.py:3: FutureWarning:

The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.

Out[4]:
Airports Periods Aircraft movements/Cross-country flights (number) Aircraft movements/Local flights (number) Commercial air traffic/Flights/All flights/Total flights (number) Commercial air traffic/Flights/All flights/Scheduled (number) Commercial air traffic/Flights/All flights/Non-scheduled (number) Commercial air traffic/Flights/Arrivals/Total arrivals flights (number) Commercial air traffic/Flights/Arrivals/Scheduled (number) Commercial air traffic/Flights/Arrivals/Non-scheduled (number) ... Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Africa/South Africa (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/America (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/North America (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/Central America (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/South America (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/Asia (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/West Asia (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/South-East Asia (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/North-East Asia (ton) Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Oceania (ton)
235 Total Dutch airports 2018-01-01 43441 3468 41247 40059 1188 20616 20040 576 ... 6 715 483 77 155 562 84 137 341 0
236 Total Dutch airports 2018-02-01 41665 4709 39014 37874 1140 19513 18966 547 ... 6 543 352 63 128 447 77 109 262 0
237 Total Dutch airports 2018-03-01 47967 4637 44687 43426 1261 22333 21712 621 ... 7 665 452 71 141 552 105 122 325 0
238 Total Dutch airports 2018-04-01 50660 5442 47362 45456 1906 23688 22717 971 ... 4 563 354 73 137 577 105 83 388 0
239 Total Dutch airports 2018-05-01 54882 5095 51151 48500 2651 25563 24249 1314 ... 4 555 333 73 149 525 97 81 347 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1765 Groningen Airport Eelde 2022-04-01 1029 4076 62 0 62 32 0 32 ... 0 0 0 0 0 0 0 0 0 0
1766 Groningen Airport Eelde 2022-05-01 1043 4264 120 0 120 57 0 57 ... 0 0 0 0 0 0 0 0 0 0
1767 Groningen Airport Eelde 2022-06-01 1260 5606 148 0 148 78 0 78 ... 0 0 0 0 0 0 0 0 0 0
1768 Groningen Airport Eelde 2022-07-01 1114 5362 132 0 132 67 0 67 ... 0 0 0 0 0 0 0 0 0 0
1769 Groningen Airport Eelde 2022-08-01 1131 5378 135 0 135 65 0 65 ... 0 0 0 0 0 0 0 0 0 0

336 rows × 104 columns

Subquestion 2 - How has the number of air traffic passengers developed in the considered time in the Netherlands?¶

The graph below displays the number of air traffic passengers at the different airports in the Netherlands, as well as total the number of passengers in the Netherlands. This is shown over a timespan between 2018 until 2022. Moreover, important events, like the start of COVID-19 in the world, during these years are illuminated. The data is retrieved from Centraal Bureau voor de Statistiek (2022). The data comprises monthly figures, i.e. the monthly number of air passengers is measured at the first day of the given month.

The hypothesis for this sub question is that the number of passengers is dependent on the governmental measures in place. In times of strict COVID-19 measures, it is expected that the number of air passengers is low. In times of low measures, it is expected that the number of passengers is broadly comparable to the number of passengers before COVID-19.

In [5]:
%matplotlib inline
# Rename columns
at_df_timespan.rename(columns={'Commercial air traffic/Passengers/Total passengers/Total passengers (number)':'Total Passengers'}, inplace=True)

# Show basic figure via plotly for the amount of air traffic passengers over time
dmax = at_df_timespan['Total Passengers'].values.max()
dmin = at_df_timespan['Total Passengers'].values.min()

fig = px.line(at_df_timespan, x='Periods', 
              y='Total Passengers',
              color='Airports', title='Amount of air traffic passengers')


# Show the normal summer peak 
fig.add_annotation(x='2018-07-01', y=0.93, yref='paper', 
                   text='Annual summer peak', font_size=8, ax=90, ay=-50)

fig.add_annotation(x='2019-07-01', y=0.93, yref='paper',
                   text='Annual summer peak', font_size=8, ax=50, ay=-35)


# Shows the start of covid and the different moments of lockdowns / easing of measurments
fig.add_annotation(x='2020-03-01', y=0.35, yref='paper', text='COVID in Europe',
                   font_size=8, ax=-60, ay=-40)

fig.add_trace(go.Scatter(x=['2020-03-01','2020-03-01'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='red', width=2, dash='dash'),
                         legendgroup='Lockdown', name='Lockdown in NL + Europe', 
                         hovertemplate ='Date: %{x: "%m/%d/%Y}'))  

fig.add_trace(go.Scatter(x=['2020-12-14','2020-12-14'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='red', width=2, dash='dash'),
                         legendgroup='Lockdown', name='Lockdown', 
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2021-12-19','2021-12-19'], 
                        y=[dmin,dmax], mode='lines', 
                        line=dict(color='red', width=2, dash='dash'),
                        legendgroup='Lockdown', name='Lockdown', 
                        hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2020-10-10','2020-10-10'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='orange', width=2, dash='dash'),
                         legendgroup='Partial Lockdown', name='Partial Lockdown',
                         hovertemplate='Date: %{x: "%m/%d/%Y}'))                         

fig.add_trace(go.Scatter(x=['2020-06-01','2020-06-01'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}'))

fig.add_trace(go.Scatter(x=['2021-06-26','2021-06-26'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
                        
fig.add_trace(go.Scatter(x=['2021-02-08','2021-02-08'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures',
                         hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))

fig.add_trace(go.Scatter(x=['2022-01-10','2022-01-10'], 
                         y=[dmin,dmax], mode='lines', 
                         line=dict(color='green', width=2, dash='dash'),
                         legendgroup='Easening of Measures', name='Easening of Measures', 
                         hovertemplate ='Date: %{x: "%m/%d/%Y}', showlegend=False))        

fig.update_layout(title='Amount of air traffic passengers', 
                  xaxis_title='Periods', yaxis_title='Total passengers') 
fig.update_layout(legend=dict(groupclick='toggleitem'))
fig.show()
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\1146178119.py:3: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

From the graph it can be concluded that the largest drop in air traffic passengers took place in February-March 2020. Around May 2020, there is a significant increase again, after which it decreases in August. Furthermore, there is a small increase in November 2020, followed by a decline in December. Around spring 2021 the number of air traffic passengers grows significantly but declines again in October. In January 2022, the number of passengers increases again and in July 2022, the number of air traffic passengers is almost at pre-COVID levels.

When comparing this to the active regulations, it can be seen that there was a temporary ban on passenger flights from risk areas in March 2020. Moreover, in Mid-March a no-fly zone on the BES -islands and other countries was implemented. In addition, in April only a limited number of flights took place. This is clearly displayed by the first large drop in the graph. During summertime, some restrictions were lifted, resulting in the increase around May. The discouragement to travel to orange and red colored countries and the only-necessary travel advice is reflected by the decreasing number of passengers around August-December 2020. The increase during spring 2021 can be explained by the fact that travel to countries with low levels of infections was allowed. Also, the possibility to travel within the EU with a negative test result, vaccination, or proof of recovery, is a possible explanations for the increase in air traffic passengers. The drop in October 2021 can be explained by the ban on certain flights. The rise of the Omicron variant is a possible explanation for the decreasing number of passengers in end-2021. Lastly, in March 2022, almost all the regulations were dropped, which explains the increase in the graph.

Data preparation subquestion 3¶

In [6]:
# Import world Covid Data

filepath2 = '/Users/zijlm/Project-TIL6022-Group-21/owid-covid-data.csv'
covid_world_df = pd.read_csv(filepath2, sep=",")


# Convert date column into datetime format
covid_world_df['date'] = pd.to_datetime(covid_world_df['date'], 
                                        format='%Y-%m-%d %H:%M:%S')
covid_world_df


# Preparing the full data set for further use
# Filtering on Covid new cases for the Netherlands
covid_nl_total_df = covid_world_df[
                                    covid_world_df['location'] == 'Netherlands'
]


# Filtering for relevant columns and dropping NAN cells
covid_nl_df = covid_nl_total_df.iloc[:, [2,3,6]]
covid_nl_clean_df = covid_nl_df.dropna()
covid_nl_clean_df
Out[6]:
location date new_cases_smoothed
139328 Netherlands 2020-03-03 5.429
139329 Netherlands 2020-03-04 11.714
139330 Netherlands 2020-03-05 18.143
139331 Netherlands 2020-03-06 26.000
139332 Netherlands 2020-03-07 36.429
... ... ... ...
140268 Netherlands 2022-09-29 1751.857
140269 Netherlands 2022-09-30 2200.857
140270 Netherlands 2022-10-01 2200.857
140271 Netherlands 2022-10-02 2200.857
140272 Netherlands 2022-10-03 2200.571

945 rows × 3 columns

In [7]:
# What unique values are in Airports column
at_df_timespan['Airports'].unique()


# Create 6 dataframes to work with
# Extract column: Commercial air traffic/Passengers/Total passengers/Total passengers (number)
at_df_total = at_df_timespan[at_df_timespan['Airports']==
                             'Total Dutch airports']
at_df_total = at_df_total[['Total Passengers','Periods', 'Airports']]

at_df_schiphol = at_df_timespan[at_df_timespan['Airports']==
                                'Amsterdam Airport Schiphol']
at_df_schiphol = at_df_schiphol[['Total Passengers', 'Periods', 'Airports']]

at_df_rotterdam = at_df_timespan[at_df_timespan['Airports']==
                                'Rotterdam The Hague Airport']
at_df_rotterdam = at_df_rotterdam[['Total Passengers', 'Periods', 'Airports']]

at_df_eindhoven = at_df_timespan[at_df_timespan['Airports']==
                                'Eindhoven Airport']
at_df_eindhoven = at_df_eindhoven[['Total Passengers', 'Periods', 'Airports']]

at_df_maastricht = at_df_timespan[at_df_timespan['Airports']==
                                 'Maastricht Aachen Airport']
at_df_maastricht = at_df_maastricht[['Total Passengers', 'Periods', 'Airports']]

at_df_groningen = at_df_timespan[at_df_timespan['Airports']==
                                'Groningen Airport Eelde']
at_df_groningen = at_df_groningen[['Total Passengers', 'Periods', 'Airports']]


#Rename all passenger columns to shorter name 
at_df_total = at_df_total.rename(columns=
                                {'Total Passengers':'Number of Passengers'})

at_df_schiphol = at_df_schiphol.rename(columns=
                                {'Total Passengers':'Number of Passengers'})

at_df_rotterdam = at_df_rotterdam.rename(columns=
                                {'Total Passengers':'Number of Passengers'})

at_df_eindhoven = at_df_eindhoven.rename(columns=
                                {'Total Passengers':'Number of Passengers'})

at_df_maastricht = at_df_maastricht.rename(columns=
                                {'Total Passengers':'Number of Passengers'})

at_df_groningen = at_df_groningen.rename(columns=
                                {'Total Passengers':'Number of Passengers'})


#CREATE BASE YEAR COLUMN 


#Create list of 2018 number of passengers
total_base_year_2018 = at_df_total['Number of Passengers'].to_list()
total_base_year_2018 = total_base_year_2018[0:12]
total_base_year = []

schiphol_base_year_2018 = at_df_schiphol['Number of Passengers'].to_list()
schiphol_base_year_2018 = schiphol_base_year_2018[0:12]
schiphol_base_year = []

rotterdam_base_year_2018 = at_df_rotterdam['Number of Passengers'].to_list()
rotterdam_base_year_2018 = rotterdam_base_year_2018[0:12]
rotterdam_base_year = []

eindhoven_base_year_2018 = at_df_eindhoven['Number of Passengers'].to_list()
eindhoven_base_year_2018 = eindhoven_base_year_2018[0:12]
eindhoven_base_year = []

maastricht_base_year_2018 = at_df_maastricht['Number of Passengers'].to_list()
maastricht_base_year_2018 = maastricht_base_year_2018[0:12]
maastricht_base_year = []

groningen_base_year_2018 = at_df_groningen['Number of Passengers'].to_list()
groningen_base_year_2018 = groningen_base_year_2018[0:12]
groningen_base_year = []

#Create 5 times base year list
total_base_year = total_base_year_2018 * 5

schiphol_base_year = schiphol_base_year_2018 * 5

rotterdam_base_year = rotterdam_base_year_2018 * 5 

eindhoven_base_year = eindhoven_base_year_2018 * 5

maastricht_base_year = maastricht_base_year_2018 * 5

groningen_base_year = groningen_base_year_2018 * 5

#Strip elements from base year
#Base year needs to have the same length as dataframe column 
total_base_year = total_base_year[: len(at_df_total.index)]

schiphol_base_year = schiphol_base_year[: len(at_df_schiphol.index)]

rotterdam_base_year = rotterdam_base_year[: len(at_df_rotterdam.index)]

eindhoven_base_year = eindhoven_base_year[: len(at_df_eindhoven.index)]

maastricht_base_year = maastricht_base_year[: len(at_df_maastricht.index)]

groningen_base_year = groningen_base_year[: len(at_df_groningen.index)]


#Create column in dataframe with this base year
at_df_total['Previous number passengers (2018)'] = total_base_year

at_df_schiphol['Previous number passengers (2018)'] = schiphol_base_year

at_df_rotterdam['Previous number passengers (2018)'] = rotterdam_base_year

at_df_eindhoven['Previous number passengers (2018)'] = eindhoven_base_year

at_df_maastricht['Previous number passengers (2018)'] = maastricht_base_year

at_df_groningen['Previous number passengers (2018)'] = groningen_base_year

#Create percentage column 
at_df_total['Percentage incline/decline'] = ((at_df_total['Number of Passengers'] -
                                              at_df_total['Previous number passengers (2018)']) /
                                              at_df_total['Previous number passengers (2018)']) * 100

at_df_schiphol['Percentage incline/decline'] = ((at_df_schiphol['Number of Passengers'] - 
                                                 at_df_schiphol['Previous number passengers (2018)']) / 
                                                 at_df_schiphol['Previous number passengers (2018)']) * 100

at_df_rotterdam['Percentage incline/decline'] = ((at_df_rotterdam['Number of Passengers'] - 
                                                  at_df_rotterdam['Previous number passengers (2018)']) / 
                                                  at_df_rotterdam['Previous number passengers (2018)']) * 100

at_df_eindhoven['Percentage incline/decline'] = ((at_df_eindhoven['Number of Passengers'] - 
                                                  at_df_eindhoven['Previous number passengers (2018)']) / 
                                                  at_df_eindhoven['Previous number passengers (2018)']) * 100

at_df_maastricht['Percentage incline/decline'] = ((at_df_maastricht['Number of Passengers'] - 
                                                   at_df_maastricht['Previous number passengers (2018)']) / 
                                                   at_df_maastricht['Previous number passengers (2018)']) * 100

at_df_groningen['Percentage incline/decline'] = ((at_df_groningen['Number of Passengers'] - 
                                                  at_df_groningen['Previous number passengers (2018)']) / 
                                                  at_df_groningen['Previous number passengers (2018)']) * 100

#Set index to periods to make plotting easier
at_df_total = at_df_total.set_index('Periods')

at_df_schiphol = at_df_schiphol.set_index('Periods')

at_df_rotterdam = at_df_rotterdam.set_index('Periods')

at_df_eindhoven = at_df_eindhoven.set_index('Periods')

at_df_maastricht = at_df_maastricht.set_index('Periods')

at_df_groningen = at_df_groningen.set_index('Periods')

#at_df_eindhoven.head(56)
at_df_rotterdam.head(48)


#Concat all 6 dataframes into 1 dataframe
at_df_complete = pd.concat([at_df_total, at_df_schiphol, at_df_rotterdam,
                            at_df_eindhoven, at_df_maastricht, at_df_groningen])

at_df_complete.head(36)
Out[7]:
Number of Passengers Airports Previous number passengers (2018) Percentage incline/decline
Periods
2018-01-01 5410899 Total Dutch airports 5410899 0.000000
2018-02-01 5237331 Total Dutch airports 5237331 0.000000
2018-03-01 6151187 Total Dutch airports 6151187 0.000000
2018-04-01 6730695 Total Dutch airports 6730695 0.000000
2018-05-01 7261667 Total Dutch airports 7261667 0.000000
2018-06-01 7233806 Total Dutch airports 7233806 0.000000
2018-07-01 7691695 Total Dutch airports 7691695 0.000000
2018-08-01 7786633 Total Dutch airports 7786633 0.000000
2018-09-01 7294410 Total Dutch airports 7294410 0.000000
2018-10-01 7262779 Total Dutch airports 7262779 0.000000
2018-11-01 5802548 Total Dutch airports 5802548 0.000000
2018-12-01 5742668 Total Dutch airports 5742668 0.000000
2019-01-01 5495052 Total Dutch airports 5410899 1.555250
2019-02-01 5352301 Total Dutch airports 5237331 2.195202
2019-03-01 6270788 Total Dutch airports 6151187 1.944356
2019-04-01 6926059 Total Dutch airports 6730695 2.902583
2019-05-01 7396960 Total Dutch airports 7261667 1.863112
2019-06-01 7471334 Total Dutch airports 7233806 3.283583
2019-07-01 7730263 Total Dutch airports 7691695 0.501424
2019-08-01 7859458 Total Dutch airports 7786633 0.935257
2019-09-01 7486440 Total Dutch airports 7294410 2.632564
2019-10-01 7354352 Total Dutch airports 7262779 1.260853
2019-11-01 5885771 Total Dutch airports 5802548 1.434249
2019-12-01 5938523 Total Dutch airports 5742668 3.410523
2020-01-01 5595249 Total Dutch airports 5410899 3.407012
2020-02-01 5281600 Total Dutch airports 5237331 0.845259
2020-03-01 2773554 Total Dutch airports 6151187 -54.910264
2020-04-01 133752 Total Dutch airports 6730695 -98.012806
2020-05-01 220120 Total Dutch airports 7261667 -96.968740
2020-06-01 526544 Total Dutch airports 7233806 -92.721066
2020-07-01 1690515 Total Dutch airports 7691695 -78.021554
2020-08-01 2242935 Total Dutch airports 7786633 -71.195060
2020-09-01 1547263 Total Dutch airports 7294410 -78.788374
2020-10-01 1303123 Total Dutch airports 7262779 -82.057515
2020-11-01 965071 Total Dutch airports 5802548 -83.368151
2020-12-01 1306018 Total Dutch airports 5742668 -77.257644

Subquestion 3 - Are there relative differences in the development of air traffic passengers between the considered airports in the Netherlands?¶

The graph below shows the relative differences of air traffic passengers between the various airports in The Netherlands. The year 2018 is used as base year, every month in the following years is compared to the respective month in 2018. As such, the percentage increase or decrease of the air traffic passengers due to COVID-19 can be visualized easily.

The hypothesis is that there will be only small differences in 2019 compared to 2018. From February or March 2020, there will be a big drop that will be equally felt by all airports, given the impactful measures at that time. In addition, it is expected that airports with a relatively high number of local flights will ultimately have the least impact, as they are less dependent on restrictions related to international travel. According to the database, Groningen Airport Eelde operates most local flights and therefore would be expected to be least affected by the restrictions overall.

In [8]:
# Figure is added with the relative incline/ decline of the airport
fig = px.line(at_df_complete, y='Percentage incline/decline',
              color='Airports', title='Number of air traffic passengers', width=1000, height=800)

fig.show()

The year 2019 shows small growth for Amsterdam Airport Schiphol, Rotterdam The Hague Airport and Eindhoven Airport. In contrast, the differences in growth for the smaller airports Maastricht Aachen Airport and Groningen Airport Eelde is very apparent in 2019. According to Centraal Bureau voor de Statistiek, the large growth of Maastricht Aachen Airport be explained by the fact that it is a relatively small airport; a small change in the number of air passenger will have a relatively large effect (2019). The decline in the number of air passengers for Groningen Airport Eelde can be explained by the fact that its financial situation appeared to have deteriorated in recent years (Regionale luchthavens, n.d.).

From February 2020 onwards, there is indeed a steep decline in the amount of air traffic passengers, which applies to all airports. The lowest point of air passengers is reached in April 2020. From this point onwards, aviation began to slowly get back on track and passenger numbers rose until today. The graph shows that the total number of air passengers in the Netherlands is currently at 82% of pre-COVID levels. The number of passengers at Rotterdam The Hague Airport, Eindhoven Airport and Maastricht Aachen Airport are currently even above pre-COVID levels. However, against expectations, Groningen Airport Eelde has experienced the largest decrease in passenger numbers (currently at 47% of pre-COVID levels). It seems that financial setbacks have had more impact on this airport than the COVID-19 restrictions. Therefore, the hypothesis is rejected.

Data preparation subquestion 4¶

In [9]:
# The correct dataframe is created

# Extract only the total Dutch airports
# Extract the coloms needed (period, the number of passengers per continent)
q4_at_total = at_df_timespan[at_df_timespan['Airports'] == 'Total Dutch airports']
q4_at_total = q4_at_total[['Periods', 
                           'Commercial air traffic/Passengers/Country of origin/destination/Europe/Europe total (number)', 
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/North America (number)',
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/Central America (number)',
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/South America (number)', 
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Asia/Asia (number)', 
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Oceania (number)', 
                           'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Africa/Africa (number)']]


# Rename the colomns to shorter names 
q4_at_total = q4_at_total.rename(columns={'Commercial air traffic/Passengers/Country of origin/destination/Europe/Europe total (number)': 'Europe',  
                                          'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/North America (number)' : 'North America',
                                          'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/Central America (number)' : 'Central America',
                                          'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/South America (number)' : 'South America',
                                          'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Asia/Asia (number)': 'Asia', 
                                          'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Oceania (number)': 'Oceania', 
                                        'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Africa/Africa (number)' : 'Africa'})


# In the dataset, the continent North America is split into North and Central
# Here it is combined into one column 'North Central America'
q4_at_total['NorthCentralAmerica'] = q4_at_total['North America'] + q4_at_total['Central America']
del q4_at_total['North America']
del q4_at_total['Central America']
In [10]:
# Base Year column is created per continent
# Required to see the relative change for the different airports over the time 

# Europe
base_year_europe_2018 = q4_at_total['Europe'].to_list()
base_year_europe_2018 = base_year_europe_2018[0:12]
base_year_europe = []

base_year_europe = base_year_europe_2018 * 5
base_year_europe = base_year_europe[: len(q4_at_total.index)]
q4_at_total['Base year Europe (2018)'] = base_year_europe
q4_at_total['Percentage Europe'] = 100 + ((q4_at_total['Europe'] - 
                                           q4_at_total['Base year Europe (2018)']) / 
                                           q4_at_total['Base year Europe (2018)'] * 100)


# North Central America
base_year_ncamerica_2018 = q4_at_total['NorthCentralAmerica'].to_list()
base_year_ncamerica_2018 = base_year_ncamerica_2018[0:12]
base_year_ncamerica = []

base_year_ncamerica = base_year_ncamerica_2018 * 5
base_year_ncamerica = base_year_ncamerica[: len(q4_at_total.index)]
q4_at_total['Base year NorthCentralAmerica (2018)'] = base_year_ncamerica
q4_at_total['Percentage NorthCentralAmerica'] = 100 + ((q4_at_total['NorthCentralAmerica'] - 
                                                  q4_at_total['Base year NorthCentralAmerica (2018)']) / 
                                                  q4_at_total['Base year NorthCentralAmerica (2018)'] * 100)


# South America
base_year_southamerica_2018 = q4_at_total['South America'].to_list()
base_year_southamerica_2018 = base_year_southamerica_2018[0:12]
base_year_southamerica = []

base_year_southamerica = base_year_southamerica_2018 * 5
base_year_southamerica = base_year_southamerica[: len(q4_at_total.index)]
q4_at_total['Base year South America (2018)'] = base_year_southamerica
q4_at_total['Percentage South America'] = 100 + ((q4_at_total['South America'] -
                                                  q4_at_total['Base year South America (2018)']) / 
                                                  q4_at_total['Base year South America (2018)'] * 100)


# Asia
base_year_asia_2018 = q4_at_total['Asia'].to_list()
base_year_asia_2018 = base_year_asia_2018[0:12]
base_year_asia = []

base_year_asia = base_year_asia_2018 * 5
base_year_asia = base_year_asia[: len(q4_at_total.index)]
q4_at_total['Base year Asia (2018)'] = base_year_asia
q4_at_total['Percentage Asia'] = 100 + ((q4_at_total['Asia'] - 
                                         q4_at_total['Base year Asia (2018)']) / 
                                         q4_at_total['Base year Asia (2018)'] * 100)


# Oceania
base_year_oceania_2018 = q4_at_total['Oceania'].to_list()
base_year_oceania_2018 = base_year_oceania_2018[0:12]
base_year_oceania = []

base_year_oceania = base_year_oceania_2018 * 5
base_year_oceania = base_year_oceania[: len(q4_at_total.index)]
q4_at_total['Base year Oceania (2018)'] = base_year_oceania
q4_at_total['Percentage Oceania'] = 100 + ((q4_at_total['Oceania'] - 
                                            q4_at_total['Base year Oceania (2018)']) / 
                                            q4_at_total['Base year Oceania (2018)'] * 100)


# Africa
base_year_africa_2018 = q4_at_total['Africa'].to_list()
base_year_africa_2018 = base_year_africa_2018[0:12]
base_year_africa = []

base_year_africa = base_year_africa_2018 * 5
base_year_africa = base_year_africa[: len(q4_at_total.index)]
q4_at_total['Base year Africa (2018)'] = base_year_africa
q4_at_total['Percentage Africa'] = 100 + ((q4_at_total['Africa'] - 
                                          q4_at_total['Base year Africa (2018)']) / 
                                          q4_at_total['Base year Africa (2018)'] * 100)

q4_at_total.head()
Out[10]:
Periods Europe South America Asia Oceania Africa NorthCentralAmerica Base year Europe (2018) Percentage Europe Base year NorthCentralAmerica (2018) Percentage NorthCentralAmerica Base year South America (2018) Percentage South America Base year Asia (2018) Percentage Asia Base year Oceania (2018) Percentage Oceania Base year Africa (2018) Percentage Africa
235 2018-01-01 3805859 134923 599996 0 270955 599165 3805859 100.0 599165 100.0 134923 100.0 599996 100.0 0 NaN 270955 100.0
236 2018-02-01 3793051 121471 558192 0 244383 520231 3793051 100.0 520231 100.0 121471 100.0 558192 100.0 0 NaN 244383 100.0
237 2018-03-01 4455464 132398 623321 0 276990 663012 4455464 100.0 663012 100.0 132398 100.0 623321 100.0 0 NaN 276990 100.0
238 2018-04-01 4932741 131039 631721 0 262484 772701 4932741 100.0 772701 100.0 131039 100.0 631721 100.0 0 NaN 262484 100.0
239 2018-05-01 5456899 134519 600868 0 241021 828355 5456899 100.0 828355 100.0 134519 100.0 600868 100.0 0 NaN 241021 100.0
In [11]:
# Dataframe consisting of period and percentage per continent
q4_at_percentage = q4_at_total[['Periods', 'Percentage Europe',
                                     'Percentage NorthCentralAmerica', 'Percentage South America',
                                     'Percentage Asia', 'Percentage Oceania', 'Percentage Africa']]

q4_at_percentage = q4_at_percentage.set_index('Periods')
q4_at_percentage.head(60)
Out[11]:
Percentage Europe Percentage NorthCentralAmerica Percentage South America Percentage Asia Percentage Oceania Percentage Africa
Periods
2018-01-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-02-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-03-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-04-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-05-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-06-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-07-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-08-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-09-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-10-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-11-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2018-12-01 100.000000 100.000000 100.000000 100.000000 NaN 100.000000
2019-01-01 100.896749 104.442182 107.797781 100.632504 NaN 103.355908
2019-02-01 101.923939 105.128299 108.203604 99.444456 NaN 103.458097
2019-03-01 102.060324 105.077736 105.166996 97.655141 NaN 100.691361
2019-04-01 103.277569 103.775199 102.667908 98.592575 NaN 103.780040
2019-05-01 102.165241 104.490104 98.086516 97.952795 NaN 97.851225
2019-06-01 103.682643 104.683262 97.322592 97.264756 NaN 108.043648
2019-07-01 100.451098 104.014547 98.161834 96.548693 NaN 101.189021
2019-08-01 101.106922 104.275644 98.060752 95.689600 NaN 101.235414
2019-09-01 103.099924 104.915006 91.700944 97.566742 NaN 103.767755
2019-10-01 101.723139 102.772130 99.948387 96.306591 NaN 100.076300
2019-11-01 101.506241 102.628134 106.515429 99.129834 NaN 100.023184
2019-12-01 104.131710 105.256274 102.704056 98.218290 NaN 100.110622
2020-01-01 103.355064 107.094540 108.255079 98.869826 NaN 103.615730
2020-02-01 101.513030 111.170615 110.189263 80.724195 NaN 109.815740
2020-03-01 43.005891 52.669484 66.183779 40.697811 NaN 60.264992
2020-04-01 1.529008 3.245369 3.832447 3.933857 inf 1.095305
2020-05-01 2.635911 3.995992 6.656309 5.073494 NaN 1.552147
2020-06-01 7.307845 7.148388 10.022312 8.263153 NaN 3.098927
2020-07-01 25.768998 12.392835 9.915672 11.563843 NaN 7.480316
2020-08-01 34.825130 14.217797 13.200855 10.758444 NaN 7.776577
2020-09-01 24.152286 13.393904 15.540217 11.559010 NaN 11.381908
2020-10-01 19.143115 15.240423 17.298332 11.913931 NaN 16.753678
2020-11-01 16.562731 20.258550 18.744992 12.303270 NaN 17.488583
2020-12-01 22.374328 26.747942 33.070439 14.921390 NaN 30.086732
2021-01-01 15.520149 23.393055 25.422648 12.892086 NaN 24.773855
2021-02-01 8.939057 14.780165 9.426941 9.538653 NaN 16.030984
2021-03-01 10.042186 15.412089 16.256288 11.050486 NaN 13.225748
2021-04-01 11.501739 13.188284 20.136753 12.575488 NaN 16.301565
2021-05-01 15.897417 17.476444 18.044291 13.874595 NaN 20.644674
2021-06-01 26.257463 27.199186 27.253261 16.234826 NaN 35.834532
2021-07-01 48.472744 44.263632 34.684209 21.502785 NaN 57.639113
2021-08-01 62.678401 50.769772 45.090252 24.191271 NaN 62.638144
2021-09-01 60.760257 43.760590 51.848148 22.192036 NaN 52.042653
2021-10-01 67.053123 47.652080 66.434168 27.040859 NaN 46.136027
2021-11-01 63.965211 65.633450 75.655776 31.878678 NaN 43.105434
2021-12-01 56.322608 72.612619 72.819646 35.577985 NaN 44.281694
2022-01-01 52.766747 69.668455 77.618345 29.606364 NaN 45.608680
2022-02-01 60.107470 67.805648 84.519762 32.262913 NaN 51.060426
2022-03-01 71.896193 77.255012 91.193976 38.800554 NaN 59.045814
2022-04-01 79.967953 82.509276 98.542419 40.467706 NaN 66.192987
2022-05-01 86.877914 88.332901 96.784097 49.148565 NaN 80.487177
2022-06-01 86.649167 94.937623 92.929875 49.447696 NaN 86.806954
2022-07-01 80.808859 97.755632 91.473781 53.120166 NaN 87.009950
2022-08-01 82.783463 94.796890 93.272207 52.865359 NaN 88.703089

Subquestion 4 - How has COVID-19 impacted air traffic from and to various regions / continents?¶

In these graphs the relative changes in the number of passengers per continent is displayed by means of percentages. Furthermore, a map is shown in which the percentual changes over time can be seen. The hypothesis for this sub question is that the number of air passengers on intercontinental flights has been more affected than the number of passengers on European flights.

Due to lack of available data oceania was left out of scope.

In [12]:
# Plot figure with relative change for the different continents over the time
# Base year is 2018
fig = px.line(q4_at_percentage, y = ['Percentage Europe', 
                                     'Percentage NorthCentralAmerica', 'Percentage South America', 
                                     'Percentage Asia', 'Percentage Africa'])
fig.update_layout(title='Number of air traffic passengers per continent', 
                  xaxis_title= 'Date', yaxis_title = 'index base (2018=100)') 
fig.show()
In [13]:
# Import gapminder data set 
# Make list of all countries, relevant continent and iso_alpha code
df_map = px.data.gapminder()
df_map_country_continent = df_map.iloc[:, [0,1,6]]
df_map_2 = df_map_country_continent.drop_duplicates()


# For each country create correct number of rows (total number of periods)
df_map_3 = df_map_2.append([df_map_2] * (len(q4_at_percentage.index) - 1))
df_map_3 = df_map_3.sort_values('country', ascending=True)


# Add column with periods to dataframe of countries  
periode = q4_at_percentage.index.to_list()
periodes = periode * 142
df_map_3['Periods'] = periodes


# For each continent subsequently a dataframe and list is created
# This contains all the periods for all the countries in the continent
# For every continent a column is added with the change in passengers

# Asia
df_map_asia = df_map_3[df_map_3['continent'] == 'Asia']

number_asia = df_map_asia['country'].nunique()
percentage_asia_list = q4_at_percentage['Percentage Asia'].to_list()
percentage_asia_list_all = []
percentage_asia_list_all = percentage_asia_list * number_asia

df_map_asia['percentage'] = percentage_asia_list_all


# Europe
df_map_europe = df_map_3[df_map_3['continent'] == 'Europe']

number_europe = df_map_europe['country'].nunique()
percentage_europe_list = q4_at_percentage['Percentage Europe'].to_list()
percentage_europe_list_all = []
percentage_europe_list_all = percentage_europe_list * number_europe

df_map_europe['percentage'] = percentage_europe_list_all


# Africa
df_map_africa = df_map_3[df_map_3['continent'] == 'Africa']

number_africa = df_map_africa['country'].nunique()
percentage_africa_list = q4_at_percentage['Percentage Africa'].to_list()
percentage_africa_list_all = []
percentage_africa_list_all = percentage_africa_list * number_africa

df_map_africa['percentage'] = percentage_africa_list_all


# Oceania
df_map_oceania = df_map_3[df_map_3['continent'] == 'Oceania']

number_oceania = df_map_oceania['country'].nunique()
percentage_oceania_list = q4_at_percentage['Percentage Oceania'].to_list()
percentage_oceania_list_all = []
percentage_oceania_list_all = percentage_oceania_list * number_oceania

df_map_oceania['percentage'] = percentage_oceania_list_all


# North Central America
# Dataframe created by excluding South American countries from 'Americas'
df_map_northcentralamerica = df_map_3[df_map_3['continent'] == 'Americas']
df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Argentina'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Bolivia'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Brazil'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Chile'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Colombia'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Ecuador'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Paraguay'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Peru'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Uruguay'
]

df_map_northcentralamerica = df_map_northcentralamerica[
                                                        df_map_northcentralamerica.country != 'Venezuela'
]

df_map_northcentralamerica['continent'] = 'North Central America'
df_map_northcentralamerica['country'].unique()

number_northcentralamerica = df_map_northcentralamerica[
                                                        'country'].nunique()
percentage_northcentralamerica_list = q4_at_percentage[
                                                       'Percentage NorthCentralAmerica'].to_list()
percentage_northcentralamerica_list_all = []
percentage_northcentralamerica_list_all = percentage_northcentralamerica_list * \
                                          number_northcentralamerica

df_map_northcentralamerica['percentage'] = \
                                           percentage_northcentralamerica_list_all


# South America
# Dataframe created by excluding North/Central Am. countries from 'Americas'
df_map_southamerica = df_map_3[df_map_3['continent'] == 'Americas']
df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Canada'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Costa Rica'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Cuba'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Dominican Republic'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'El Salvador'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Guetemala'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Haiti'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Honduras'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Jamaica'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Mexico'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Nicaragua'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Panama'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Puerto Rico'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'Trinidad and Tobago'
]

df_map_southamerica = df_map_southamerica[
                                          df_map_southamerica.country != 'United States'
]

df_map_southamerica['continent'] = 'South America'
df_map_southamerica['country'].unique()

number_southamerica = df_map_southamerica['country'].nunique()
percentage_southamerica_list = q4_at_percentage[
                                                'Percentage South America'].to_list()
percentage_southamerica_list_all = []
percentage_southamerica_list_all = percentage_southamerica_list * \
                                   number_southamerica

df_map_southamerica['percentage'] = percentage_southamerica_list_all


# Link together dataframe of the various continents
# Convert period into string data type
map_complete = pd.concat([df_map_asia, df_map_europe, df_map_africa, 
                          df_map_northcentralamerica, df_map_southamerica])
map_complete['Periods'] = map_complete['Periods'].dt.strftime('%Y-%m-%d')


# Plot chlorpeth map with countries grouped into the continents
# Slider for the periods and color range indicating the number of air passengers
fig = px.choropleth(map_complete, locations='iso_alpha', color='percentage',
                    hover_name='continent', animation_frame="Periods", range_color=[0,110], 
                    projection='natural earth', color_continuous_scale='rdylbu')
fig.show()
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:9: FutureWarning:

The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:31: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:42: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:53: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:64: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

When looking at the graph and the map, the following is concluded: First, in February 2020 a large drop in the number of passengers occured for all continents. Around summer (May 2020) these numbers of passengers increase again. Especially for flights to Europe, the number of passengers was at 35% of pre-COVID levels. This can be explained by the fact that flights to European countries were partly allowed again during this period.

In August 2020, there is again a decline in the number of passengers for European fligths, continuing until circa February 2021. This decline can be explained by the call for only necessary travel. On the other hand, for the other continents (except for Asia), there is a small peak in the number of passengers around November 2020. This could be explained by the fact that it was possible to travel with a negative test result. Around April 2021, when traveling to many countries was possible again, the number of passengers started increasing for all continents. After this, there were smaller drops, for example, air traffic from/to Africa significantly declined between August-November 2021. This can be explained by the Omicron variant due to which a lot of regulations were set. Moreover, air traffic passengers within Europe declined in October 2021 and January 2022, but these drops were not as great as in February 2020. Around July 2022, the numbers of air traffic passengers are comparable to pre-COVID levels. Except for Asia, the number of passengers from/to Asia are still low (53% of pre-COVId levels), which can be explained by the fact that COVID-19 was still very active in Asia around this time.

The hypothesis is partly confirmed. During some periods, the number of air passengers within Europe was less affected than international air passengers. However, there were also periods in which international travel was less affected than European travel. This is mostly remarkable in January 2022 for North, Middle, South America. This can be explained by the fact that there were regular bans on flight to specific parts of the world as well as within Europe (as can be read in the regulations overview). Possibly, consumer preference also played a role (e.g. increased preference for international travel after COVID-19). It is also notable that, at the moment, Europe is further down pre-COVID levels than Africa and South/Middle America, therefore the hypothesis is partly rejected as well.

Correlation¶

The first idea can be to run a correlation, this is done for two cases. The first case takes into account all 0-value covid cases before March 2020. The second correlation only takes into account the data for which there are covid cases (from March 2020 onwards).

For the first correlation it can be seen that there is a negative correlation coefficient between -0.15 and -0.30. This shows that when covid cases are low, there are more flights.

In the second case, the correlations are not really apparant. This can be explained by the fact that there is missing information in our dataframe to simply use a correlation to verify the relationship between new covid cases and number of passengers. For example, March and April 2020 had relatively few covid cases, because the test capacity was very low. However, there were not many flights. Also, the past months show that there are a lot of new covid cases, while there are simultaneaously a lot of air passengers. This can be due to the fact that there is more testing capacity and/or the variant is more mild.

In conclusion, a correlation was one of the first analysis methods that came to mind in order to answer our research question. However, simply looking at the correlation coefficients is not suffient to answer our research question. The reason is explained above. Therefore, we based our answer to the research question mainly on the figures.

A correlation could have been a good method when there would be certain weights for certain months. For example, number of new cases is multiplied with a 'larger'weight when there is a more severe covid variant. However, how to apply these weight would require extensive statistical knowledge and this fall outside the scope of this course.

In [14]:
covid_nl_clean_df.head()
at_df_timespan.head()
at_df_timespan_corr  = at_df_timespan[['Periods', 'Airports', 'Total Passengers' ]]
at_df_timespan_corr.head(120)
Out[14]:
Periods Airports Total Passengers
235 2018-01-01 Total Dutch airports 5410899
236 2018-02-01 Total Dutch airports 5237331
237 2018-03-01 Total Dutch airports 6151187
238 2018-04-01 Total Dutch airports 6730695
239 2018-05-01 Total Dutch airports 7261667
... ... ... ...
828 2018-04-01 Rotterdam The Hague Airport 144208
829 2018-05-01 Rotterdam The Hague Airport 221150
830 2018-06-01 Rotterdam The Hague Airport 217739
831 2018-07-01 Rotterdam The Hague Airport 230635
832 2018-08-01 Rotterdam The Hague Airport 232799

120 rows × 3 columns

In [15]:
# Include months with zero Covid cases
# Create year and month columns and groupby 
df_cases = covid_nl_clean_df.copy()

df_cases['year'] = pd.DatetimeIndex(df_cases['date']).year
df_cases['month'] = pd.DatetimeIndex(df_cases['date']).month

df_cases = df_cases.groupby(by=['year', 'month']).agg({'new_cases_smoothed':
                                                     'sum'})


# Delete 2022-09 & 2022-10, since no airport-data available for these months
# Remove multi-index from groupby
df_cases = df_cases.iloc[:-2]
df_test = df_cases.reset_index()


# Loop through airports to get correlation 
# Correlation of #cases/month in NL with #passenger/month at certain airport
for i in at_df_timespan_corr['Airports'].unique().tolist():
    
    # Take only airport of interest
    df_temp = at_df_timespan_corr[at_df_timespan_corr['Airports']==i]

    # Create year and month variable 
    df_temp['year'] = pd.DatetimeIndex(df_temp['Periods']).year
    df_temp['month'] = pd.DatetimeIndex(df_temp['Periods']).month
    
    # Merge 'new cases' and 'flights per airport' on year and month
    df_temp = df_temp.reset_index(drop=True)
    df_concat = df_temp.merge(df_test, on=['year', 'month'], how='outer')
    
    # Rename columns for convenience
    df_concat.columns = ['Periods', 'Airports', 'Total passengers', 'year',
                         'month', 'New Cases']
    
    # Fill 'New cases column' with 0 cases, if NaN (so before '2022-03')
    df_concat['New Cases'] = df_concat['New Cases'].fillna(0)
    
    # If you want to print your data (Uncomment this for second case)
    print(df_concat[['New Cases', 'Periods', 'Airports', 'Total passengers']])
    
    print('Correlation at', i, 'is: ')
    print(df_concat[['New Cases', 'Total passengers']].corr())
    print(' ')
      New Cases    Periods              Airports  Total passengers
0         0.000 2018-01-01  Total Dutch airports           5410899
1         0.000 2018-02-01  Total Dutch airports           5237331
2         0.000 2018-03-01  Total Dutch airports           6151187
3         0.000 2018-04-01  Total Dutch airports           6730695
4         0.000 2018-05-01  Total Dutch airports           7261667
5         0.000 2018-06-01  Total Dutch airports           7233806
6         0.000 2018-07-01  Total Dutch airports           7691695
7         0.000 2018-08-01  Total Dutch airports           7786633
8         0.000 2018-09-01  Total Dutch airports           7294410
9         0.000 2018-10-01  Total Dutch airports           7262779
10        0.000 2018-11-01  Total Dutch airports           5802548
11        0.000 2018-12-01  Total Dutch airports           5742668
12        0.000 2019-01-01  Total Dutch airports           5495052
13        0.000 2019-02-01  Total Dutch airports           5352301
14        0.000 2019-03-01  Total Dutch airports           6270788
15        0.000 2019-04-01  Total Dutch airports           6926059
16        0.000 2019-05-01  Total Dutch airports           7396960
17        0.000 2019-06-01  Total Dutch airports           7471334
18        0.000 2019-07-01  Total Dutch airports           7730263
19        0.000 2019-08-01  Total Dutch airports           7859458
20        0.000 2019-09-01  Total Dutch airports           7486440
21        0.000 2019-10-01  Total Dutch airports           7354352
22        0.000 2019-11-01  Total Dutch airports           5885771
23        0.000 2019-12-01  Total Dutch airports           5938523
24        0.000 2020-01-01  Total Dutch airports           5595249
25        0.000 2020-02-01  Total Dutch airports           5281600
26    10656.001 2020-03-01  Total Dutch airports           2773554
27    27924.714 2020-04-01  Total Dutch airports            133752
28     7582.998 2020-05-01  Total Dutch airports            220120
29     4043.568 2020-06-01  Total Dutch airports            526544
30     3634.429 2020-07-01  Total Dutch airports           1690515
31    16229.146 2020-08-01  Total Dutch airports           2242935
32    45306.571 2020-09-01  Total Dutch airports           1547263
33   216295.287 2020-10-01  Total Dutch airports           1303123
34   182778.574 2020-11-01  Total Dutch airports            965071
35   266188.860 2020-12-01  Total Dutch airports           1306018
36   191199.141 2021-01-01  Total Dutch airports            909617
37   109028.142 2021-02-01  Total Dutch airports            519827
38   179947.141 2021-03-01  Total Dutch airports            676647
39   222759.287 2021-04-01  Total Dutch airports            817876
40   162576.713 2021-05-01  Total Dutch airports           1169673
41    40344.716 2021-06-01  Total Dutch airports           1870330
42   174610.284 2021-07-01  Total Dutch airports           3515159
43    78988.999 2021-08-01  Total Dutch airports           4479180
44    63854.573 2021-09-01  Total Dutch airports           4013477
45   116907.427 2021-10-01  Total Dutch airports           4395945
46   482635.572 2021-11-01  Total Dutch airports           3492940
47   505056.000 2021-12-01  Total Dutch airports           3208864
48  1177889.571 2022-01-01  Total Dutch airports           2831598
49  1987987.427 2022-02-01  Total Dutch airports           3040193
50  1514981.857 2022-03-01  Total Dutch airports           4241663
51   264584.427 2022-04-01  Total Dutch airports           5140680
52    39185.430 2022-05-01  Total Dutch airports           6092054
53    82594.432 2022-06-01  Total Dutch airports           6118527
54   160921.573 2022-07-01  Total Dutch airports           6211931
55    56599.998 2022-08-01  Total Dutch airports           6378969
Correlation at Total Dutch airports is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.237632
Total passengers  -0.237632          1.000000
 
      New Cases    Periods                    Airports  Total passengers
0         0.000 2018-01-01  Amsterdam Airport Schiphol           4908989
1         0.000 2018-02-01  Amsterdam Airport Schiphol           4741806
2         0.000 2018-03-01  Amsterdam Airport Schiphol           5559456
3         0.000 2018-04-01  Amsterdam Airport Schiphol           6016915
4         0.000 2018-05-01  Amsterdam Airport Schiphol           6393936
5         0.000 2018-06-01  Amsterdam Airport Schiphol           6377393
6         0.000 2018-07-01  Amsterdam Airport Schiphol           6765004
7         0.000 2018-08-01  Amsterdam Airport Schiphol           6836668
8         0.000 2018-09-01  Amsterdam Airport Schiphol           6396940
9         0.000 2018-10-01  Amsterdam Airport Schiphol           6402290
10        0.000 2018-11-01  Amsterdam Airport Schiphol           5296943
11        0.000 2018-12-01  Amsterdam Airport Schiphol           5260254
12        0.000 2019-01-01  Amsterdam Airport Schiphol           4996131
13        0.000 2019-02-01  Amsterdam Airport Schiphol           4836332
14        0.000 2019-03-01  Amsterdam Airport Schiphol           5630314
15        0.000 2019-04-01  Amsterdam Airport Schiphol           6104010
16        0.000 2019-05-01  Amsterdam Airport Schiphol           6441473
17        0.000 2019-06-01  Amsterdam Airport Schiphol           6502588
18        0.000 2019-07-01  Amsterdam Airport Schiphol           6724023
19        0.000 2019-08-01  Amsterdam Airport Schiphol           6810759
20        0.000 2019-09-01  Amsterdam Airport Schiphol           6493468
21        0.000 2019-10-01  Amsterdam Airport Schiphol           6431122
22        0.000 2019-11-01  Amsterdam Airport Schiphol           5323306
23        0.000 2019-12-01  Amsterdam Airport Schiphol           5386203
24        0.000 2020-01-01  Amsterdam Airport Schiphol           5074773
25        0.000 2020-02-01  Amsterdam Airport Schiphol           4719769
26    10656.001 2020-03-01  Amsterdam Airport Schiphol           2476372
27    27924.714 2020-04-01  Amsterdam Airport Schiphol            126015
28     7582.998 2020-05-01  Amsterdam Airport Schiphol            207827
29     4043.568 2020-06-01  Amsterdam Airport Schiphol            471410
30     3634.429 2020-07-01  Amsterdam Airport Schiphol           1338857
31    16229.146 2020-08-01  Amsterdam Airport Schiphol           1854786
32    45306.571 2020-09-01  Amsterdam Airport Schiphol           1337741
33   216295.287 2020-10-01  Amsterdam Airport Schiphol           1143483
34   182778.574 2020-11-01  Amsterdam Airport Schiphol            900434
35   266188.860 2020-12-01  Amsterdam Airport Schiphol           1233043
36   191199.141 2021-01-01  Amsterdam Airport Schiphol            869129
37   109028.142 2021-02-01  Amsterdam Airport Schiphol            505194
38   179947.141 2021-03-01  Amsterdam Airport Schiphol            660176
39   222759.287 2021-04-01  Amsterdam Airport Schiphol            786652
40   162576.713 2021-05-01  Amsterdam Airport Schiphol           1106740
41    40344.716 2021-06-01  Amsterdam Airport Schiphol           1678265
42   174610.284 2021-07-01  Amsterdam Airport Schiphol           3029951
43    78988.999 2021-08-01  Amsterdam Airport Schiphol           3786973
44    63854.573 2021-09-01  Amsterdam Airport Schiphol           3370205
45   116907.427 2021-10-01  Amsterdam Airport Schiphol           3745991
46   482635.572 2021-11-01  Amsterdam Airport Schiphol           3095823
47   505056.000 2021-12-01  Amsterdam Airport Schiphol           2855711
48  1177889.571 2022-01-01  Amsterdam Airport Schiphol           2488083
49  1987987.427 2022-02-01  Amsterdam Airport Schiphol           2660676
50  1514981.857 2022-03-01  Amsterdam Airport Schiphol           3732048
51   264584.427 2022-04-01  Amsterdam Airport Schiphol           4434587
52    39185.430 2022-05-01  Amsterdam Airport Schiphol           5217035
53    82594.432 2022-06-01  Amsterdam Airport Schiphol           5232630
54   160921.573 2022-07-01  Amsterdam Airport Schiphol           5179725
55    56599.998 2022-08-01  Amsterdam Airport Schiphol           5327361
Correlation at Amsterdam Airport Schiphol is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.241102
Total passengers  -0.241102          1.000000
 
      New Cases    Periods                     Airports  Total passengers
0         0.000 2018-01-01  Rotterdam The Hague Airport             89021
1         0.000 2018-02-01  Rotterdam The Hague Airport             88493
2         0.000 2018-03-01  Rotterdam The Hague Airport            121533
3         0.000 2018-04-01  Rotterdam The Hague Airport            144208
4         0.000 2018-05-01  Rotterdam The Hague Airport            221150
5         0.000 2018-06-01  Rotterdam The Hague Airport            217739
6         0.000 2018-07-01  Rotterdam The Hague Airport            230635
7         0.000 2018-08-01  Rotterdam The Hague Airport            232799
8         0.000 2018-09-01  Rotterdam The Hague Airport            223027
9         0.000 2018-10-01  Rotterdam The Hague Airport            193930
10        0.000 2018-11-01  Rotterdam The Hague Airport             73245
11        0.000 2018-12-01  Rotterdam The Hague Airport             72378
12        0.000 2019-01-01  Rotterdam The Hague Airport             84056
13        0.000 2019-02-01  Rotterdam The Hague Airport             95420
14        0.000 2019-03-01  Rotterdam The Hague Airport            137683
15        0.000 2019-04-01  Rotterdam The Hague Airport            169142
16        0.000 2019-05-01  Rotterdam The Hague Airport            227437
17        0.000 2019-06-01  Rotterdam The Hague Airport            240069
18        0.000 2019-07-01  Rotterdam The Hague Airport            251074
19        0.000 2019-08-01  Rotterdam The Hague Airport            269858
20        0.000 2019-09-01  Rotterdam The Hague Airport            240606
21        0.000 2019-10-01  Rotterdam The Hague Airport            198592
22        0.000 2019-11-01  Rotterdam The Hague Airport             91748
23        0.000 2019-12-01  Rotterdam The Hague Airport             89113
24        0.000 2020-01-01  Rotterdam The Hague Airport             99080
25        0.000 2020-02-01  Rotterdam The Hague Airport            104062
26    10656.001 2020-03-01  Rotterdam The Hague Airport             62870
27    27924.714 2020-04-01  Rotterdam The Hague Airport                 0
28     7582.998 2020-05-01  Rotterdam The Hague Airport               134
29     4043.568 2020-06-01  Rotterdam The Hague Airport              7971
30     3634.429 2020-07-01  Rotterdam The Hague Airport             78468
31    16229.146 2020-08-01  Rotterdam The Hague Airport             74047
32    45306.571 2020-09-01  Rotterdam The Hague Airport             32047
33   216295.287 2020-10-01  Rotterdam The Hague Airport             21811
34   182778.574 2020-11-01  Rotterdam The Hague Airport              4761
35   266188.860 2020-12-01  Rotterdam The Hague Airport              4590
36   191199.141 2021-01-01  Rotterdam The Hague Airport              3311
37   109028.142 2021-02-01  Rotterdam The Hague Airport              2871
38   179947.141 2021-03-01  Rotterdam The Hague Airport                98
39   222759.287 2021-04-01  Rotterdam The Hague Airport              1945
40   162576.713 2021-05-01  Rotterdam The Hague Airport              8912
41    40344.716 2021-06-01  Rotterdam The Hague Airport             39309
42   174610.284 2021-07-01  Rotterdam The Hague Airport            113882
43    78988.999 2021-08-01  Rotterdam The Hague Airport            181957
44    63854.573 2021-09-01  Rotterdam The Hague Airport            167169
45   116907.427 2021-10-01  Rotterdam The Hague Airport            147368
46   482635.572 2021-11-01  Rotterdam The Hague Airport             48278
47   505056.000 2021-12-01  Rotterdam The Hague Airport             40295
48  1177889.571 2022-01-01  Rotterdam The Hague Airport             58903
49  1987987.427 2022-02-01  Rotterdam The Hague Airport             63510
50  1514981.857 2022-03-01  Rotterdam The Hague Airport            101163
51   264584.427 2022-04-01  Rotterdam The Hague Airport            139308
52    39185.430 2022-05-01  Rotterdam The Hague Airport            224714
53    82594.432 2022-06-01  Rotterdam The Hague Airport            224069
54   160921.573 2022-07-01  Rotterdam The Hague Airport            312468
55    56599.998 2022-08-01  Rotterdam The Hague Airport            305371
Correlation at Rotterdam The Hague Airport is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.220506
Total passengers  -0.220506          1.000000
 
      New Cases    Periods           Airports  Total passengers
0         0.000 2018-01-01  Eindhoven Airport            398089
1         0.000 2018-02-01  Eindhoven Airport            393080
2         0.000 2018-03-01  Eindhoven Airport            452090
3         0.000 2018-04-01  Eindhoven Airport            537248
4         0.000 2018-05-01  Eindhoven Airport            585787
5         0.000 2018-06-01  Eindhoven Airport            583746
6         0.000 2018-07-01  Eindhoven Airport            623708
7         0.000 2018-08-01  Eindhoven Airport            635624
8         0.000 2018-09-01  Eindhoven Airport            615201
9         0.000 2018-10-01  Eindhoven Airport            612905
10        0.000 2018-11-01  Eindhoven Airport            409628
11        0.000 2018-12-01  Eindhoven Airport            390649
12        0.000 2019-01-01  Eindhoven Airport            400481
13        0.000 2019-02-01  Eindhoven Airport            404961
14        0.000 2019-03-01  Eindhoven Airport            486336
15        0.000 2019-04-01  Eindhoven Airport            606490
16        0.000 2019-05-01  Eindhoven Airport            656099
17        0.000 2019-06-01  Eindhoven Airport            657648
18        0.000 2019-07-01  Eindhoven Airport            665638
19        0.000 2019-08-01  Eindhoven Airport            681093
20        0.000 2019-09-01  Eindhoven Airport            672355
21        0.000 2019-10-01  Eindhoven Airport            662238
22        0.000 2019-11-01  Eindhoven Airport            446930
23        0.000 2019-12-01  Eindhoven Airport            440506
24        0.000 2020-01-01  Eindhoven Airport            400991
25        0.000 2020-02-01  Eindhoven Airport            438828
26    10656.001 2020-03-01  Eindhoven Airport            225071
27    27924.714 2020-04-01  Eindhoven Airport              7732
28     7582.998 2020-05-01  Eindhoven Airport             12108
29     4043.568 2020-06-01  Eindhoven Airport             46774
30     3634.429 2020-07-01  Eindhoven Airport            257515
31    16229.146 2020-08-01  Eindhoven Airport            295053
32    45306.571 2020-09-01  Eindhoven Airport            171375
33   216295.287 2020-10-01  Eindhoven Airport            133057
34   182778.574 2020-11-01  Eindhoven Airport             57737
35   266188.860 2020-12-01  Eindhoven Airport             66544
36   191199.141 2021-01-01  Eindhoven Airport             36128
37   109028.142 2021-02-01  Eindhoven Airport             11314
38   179947.141 2021-03-01  Eindhoven Airport             16000
39   222759.287 2021-04-01  Eindhoven Airport             27805
40   162576.713 2021-05-01  Eindhoven Airport             51798
41    40344.716 2021-06-01  Eindhoven Airport            147608
42   174610.284 2021-07-01  Eindhoven Airport            344808
43    78988.999 2021-08-01  Eindhoven Airport            481576
44    63854.573 2021-09-01  Eindhoven Airport            453527
45   116907.427 2021-10-01  Eindhoven Airport            479966
46   482635.572 2021-11-01  Eindhoven Airport            341640
47   505056.000 2021-12-01  Eindhoven Airport            306254
48  1177889.571 2022-01-01  Eindhoven Airport            275066
49  1987987.427 2022-02-01  Eindhoven Airport            309283
50  1514981.857 2022-03-01  Eindhoven Airport            401775
51   264584.427 2022-04-01  Eindhoven Airport            546389
52    39185.430 2022-05-01  Eindhoven Airport            619540
53    82594.432 2022-06-01  Eindhoven Airport            631700
54   160921.573 2022-07-01  Eindhoven Airport            662646
55    56599.998 2022-08-01  Eindhoven Airport            678848
Correlation at Eindhoven Airport is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.173221
Total passengers  -0.173221          1.000000
 
      New Cases    Periods                   Airports  Total passengers
0         0.000 2018-01-01  Maastricht Aachen Airport              3286
1         0.000 2018-02-01  Maastricht Aachen Airport              3022
2         0.000 2018-03-01  Maastricht Aachen Airport              5502
3         0.000 2018-04-01  Maastricht Aachen Airport             17477
4         0.000 2018-05-01  Maastricht Aachen Airport             34418
5         0.000 2018-06-01  Maastricht Aachen Airport             31299
6         0.000 2018-07-01  Maastricht Aachen Airport             46636
7         0.000 2018-08-01  Maastricht Aachen Airport             53040
8         0.000 2018-09-01  Maastricht Aachen Airport             34945
9         0.000 2018-10-01  Maastricht Aachen Airport             32462
10        0.000 2018-11-01  Maastricht Aachen Airport              7528
11        0.000 2018-12-01  Maastricht Aachen Airport              5498
12        0.000 2019-01-01  Maastricht Aachen Airport              6140
13        0.000 2019-02-01  Maastricht Aachen Airport              6817
14        0.000 2019-03-01  Maastricht Aachen Airport              6914
15        0.000 2019-04-01  Maastricht Aachen Airport             32795
16        0.000 2019-05-01  Maastricht Aachen Airport             49734
17        0.000 2019-06-01  Maastricht Aachen Airport             50048
18        0.000 2019-07-01  Maastricht Aachen Airport             69715
19        0.000 2019-08-01  Maastricht Aachen Airport             76289
20        0.000 2019-09-01  Maastricht Aachen Airport             59255
21        0.000 2019-10-01  Maastricht Aachen Airport             46190
22        0.000 2019-11-01  Maastricht Aachen Airport             16446
23        0.000 2019-12-01  Maastricht Aachen Airport             15634
24        0.000 2020-01-01  Maastricht Aachen Airport             15115
25        0.000 2020-02-01  Maastricht Aachen Airport             14354
26    10656.001 2020-03-01  Maastricht Aachen Airport              7242
27    27924.714 2020-04-01  Maastricht Aachen Airport                 5
28     7582.998 2020-05-01  Maastricht Aachen Airport                 4
29     4043.568 2020-06-01  Maastricht Aachen Airport               389
30     3634.429 2020-07-01  Maastricht Aachen Airport             12952
31    16229.146 2020-08-01  Maastricht Aachen Airport             16818
32    45306.571 2020-09-01  Maastricht Aachen Airport              5511
33   216295.287 2020-10-01  Maastricht Aachen Airport              4710
34   182778.574 2020-11-01  Maastricht Aachen Airport              2139
35   266188.860 2020-12-01  Maastricht Aachen Airport              1841
36   191199.141 2021-01-01  Maastricht Aachen Airport              1049
37   109028.142 2021-02-01  Maastricht Aachen Airport               448
38   179947.141 2021-03-01  Maastricht Aachen Airport               373
39   222759.287 2021-04-01  Maastricht Aachen Airport              1474
40   162576.713 2021-05-01  Maastricht Aachen Airport              2223
41    40344.716 2021-06-01  Maastricht Aachen Airport              4454
42   174610.284 2021-07-01  Maastricht Aachen Airport             22399
43    78988.999 2021-08-01  Maastricht Aachen Airport             24199
44    63854.573 2021-09-01  Maastricht Aachen Airport             16364
45   116907.427 2021-10-01  Maastricht Aachen Airport             17826
46   482635.572 2021-11-01  Maastricht Aachen Airport              3744
47   505056.000 2021-12-01  Maastricht Aachen Airport              3093
48  1177889.571 2022-01-01  Maastricht Aachen Airport              5880
49  1987987.427 2022-02-01  Maastricht Aachen Airport              3288
50  1514981.857 2022-03-01  Maastricht Aachen Airport              3371
51   264584.427 2022-04-01  Maastricht Aachen Airport             15386
52    39185.430 2022-05-01  Maastricht Aachen Airport             22019
53    82594.432 2022-06-01  Maastricht Aachen Airport             20728
54   160921.573 2022-07-01  Maastricht Aachen Airport             45778
55    56599.998 2022-08-01  Maastricht Aachen Airport             53999
Correlation at Maastricht Aachen Airport is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.268272
Total passengers  -0.268272          1.000000
 
      New Cases    Periods                 Airports  Total passengers
0         0.000 2018-01-01  Groningen Airport Eelde             11514
1         0.000 2018-02-01  Groningen Airport Eelde             10930
2         0.000 2018-03-01  Groningen Airport Eelde             12606
3         0.000 2018-04-01  Groningen Airport Eelde             14847
4         0.000 2018-05-01  Groningen Airport Eelde             26376
5         0.000 2018-06-01  Groningen Airport Eelde             23629
6         0.000 2018-07-01  Groningen Airport Eelde             25712
7         0.000 2018-08-01  Groningen Airport Eelde             28502
8         0.000 2018-09-01  Groningen Airport Eelde             24297
9         0.000 2018-10-01  Groningen Airport Eelde             21192
10        0.000 2018-11-01  Groningen Airport Eelde             15204
11        0.000 2018-12-01  Groningen Airport Eelde             13889
12        0.000 2019-01-01  Groningen Airport Eelde              8244
13        0.000 2019-02-01  Groningen Airport Eelde              8771
14        0.000 2019-03-01  Groningen Airport Eelde              9541
15        0.000 2019-04-01  Groningen Airport Eelde             13622
16        0.000 2019-05-01  Groningen Airport Eelde             22217
17        0.000 2019-06-01  Groningen Airport Eelde             20981
18        0.000 2019-07-01  Groningen Airport Eelde             19813
19        0.000 2019-08-01  Groningen Airport Eelde             21459
20        0.000 2019-09-01  Groningen Airport Eelde             20756
21        0.000 2019-10-01  Groningen Airport Eelde             16210
22        0.000 2019-11-01  Groningen Airport Eelde              7341
23        0.000 2019-12-01  Groningen Airport Eelde              7067
24        0.000 2020-01-01  Groningen Airport Eelde              5290
25        0.000 2020-02-01  Groningen Airport Eelde              4587
26    10656.001 2020-03-01  Groningen Airport Eelde              1999
27    27924.714 2020-04-01  Groningen Airport Eelde                 0
28     7582.998 2020-05-01  Groningen Airport Eelde                47
29     4043.568 2020-06-01  Groningen Airport Eelde                 0
30     3634.429 2020-07-01  Groningen Airport Eelde              2723
31    16229.146 2020-08-01  Groningen Airport Eelde              2231
32    45306.571 2020-09-01  Groningen Airport Eelde               589
33   216295.287 2020-10-01  Groningen Airport Eelde                62
34   182778.574 2020-11-01  Groningen Airport Eelde                 0
35   266188.860 2020-12-01  Groningen Airport Eelde                 0
36   191199.141 2021-01-01  Groningen Airport Eelde                 0
37   109028.142 2021-02-01  Groningen Airport Eelde                 0
38   179947.141 2021-03-01  Groningen Airport Eelde                 0
39   222759.287 2021-04-01  Groningen Airport Eelde                 0
40   162576.713 2021-05-01  Groningen Airport Eelde                 0
41    40344.716 2021-06-01  Groningen Airport Eelde               694
42   174610.284 2021-07-01  Groningen Airport Eelde              4119
43    78988.999 2021-08-01  Groningen Airport Eelde              4475
44    63854.573 2021-09-01  Groningen Airport Eelde              6212
45   116907.427 2021-10-01  Groningen Airport Eelde              4794
46   482635.572 2021-11-01  Groningen Airport Eelde              3455
47   505056.000 2021-12-01  Groningen Airport Eelde              3511
48  1177889.571 2022-01-01  Groningen Airport Eelde              3666
49  1987987.427 2022-02-01  Groningen Airport Eelde              3436
50  1514981.857 2022-03-01  Groningen Airport Eelde              3306
51   264584.427 2022-04-01  Groningen Airport Eelde              5010
52    39185.430 2022-05-01  Groningen Airport Eelde              8746
53    82594.432 2022-06-01  Groningen Airport Eelde              9400
54   160921.573 2022-07-01  Groningen Airport Eelde             11314
55    56599.998 2022-08-01  Groningen Airport Eelde             13390
Correlation at Groningen Airport Eelde is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.289785
Total passengers  -0.289785          1.000000
 
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

In [16]:
# Exclude months with zero Covid cases (PRE-COVID)
# Create year and month columns and groupby
df_cases = covid_nl_clean_df.copy()

df_cases['year'] = pd.DatetimeIndex(df_cases['date']).year
df_cases['month'] = pd.DatetimeIndex(df_cases['date']).month

df_cases = df_cases.groupby(by=['year', 'month']).agg({'new_cases_smoothed':
                                                      'sum'})


# Delete 2022-09 & 2022-10, since no airport-data available for these months
# Remove multi-index from groupby
df_cases = df_cases.iloc[:-2]
df_test = df_cases.reset_index()


# Loop through airports and get correlation of #cases/month in the Netherlands with #passenger/month at certain airport
for i in at_df_timespan_corr['Airports'].unique().tolist():
    # Take only airport of interest
    df_temp = at_df_timespan_corr[at_df_timespan_corr['Airports']==i]
    # Create year and month variable 
    df_temp['year'] = pd.DatetimeIndex(df_temp['Periods']).year
    df_temp['month'] = pd.DatetimeIndex(df_temp['Periods']).month
    
    # Merge 'new cases' and 'flights per airport' on year and month
    df_temp = df_temp.reset_index(drop=True)
    df_concat = df_temp.merge(df_test,on=['year', 'month'],how='outer')
    
    # Rename columns for convenience
    df_concat.columns = ['Periods', 'Airports', 'Total passengers','year', 
                         'month', 'New Cases']
    
    # Fill 'New cases column' with 0 cases, if NaN (so before '2022-03')
    df_concat['New Cases'] = df_concat['New Cases'].fillna(0)
    
    # If you data only from '2020-03-01' (Uncomment this for second case)
    df_concat=df_concat[df_concat['Periods']>='2020-03-01']
    
    # If you want to print your data (Uncomment this for second case)
    print(df_concat[['New Cases', 'Periods', 'Airports', 'Total passengers']])
    
    print('Correlation at', i, 'is: ')
    print(df_concat[['New Cases','Total passengers']].corr())
    print(' ')
      New Cases    Periods              Airports  Total passengers
26    10656.001 2020-03-01  Total Dutch airports           2773554
27    27924.714 2020-04-01  Total Dutch airports            133752
28     7582.998 2020-05-01  Total Dutch airports            220120
29     4043.568 2020-06-01  Total Dutch airports            526544
30     3634.429 2020-07-01  Total Dutch airports           1690515
31    16229.146 2020-08-01  Total Dutch airports           2242935
32    45306.571 2020-09-01  Total Dutch airports           1547263
33   216295.287 2020-10-01  Total Dutch airports           1303123
34   182778.574 2020-11-01  Total Dutch airports            965071
35   266188.860 2020-12-01  Total Dutch airports           1306018
36   191199.141 2021-01-01  Total Dutch airports            909617
37   109028.142 2021-02-01  Total Dutch airports            519827
38   179947.141 2021-03-01  Total Dutch airports            676647
39   222759.287 2021-04-01  Total Dutch airports            817876
40   162576.713 2021-05-01  Total Dutch airports           1169673
41    40344.716 2021-06-01  Total Dutch airports           1870330
42   174610.284 2021-07-01  Total Dutch airports           3515159
43    78988.999 2021-08-01  Total Dutch airports           4479180
44    63854.573 2021-09-01  Total Dutch airports           4013477
45   116907.427 2021-10-01  Total Dutch airports           4395945
46   482635.572 2021-11-01  Total Dutch airports           3492940
47   505056.000 2021-12-01  Total Dutch airports           3208864
48  1177889.571 2022-01-01  Total Dutch airports           2831598
49  1987987.427 2022-02-01  Total Dutch airports           3040193
50  1514981.857 2022-03-01  Total Dutch airports           4241663
51   264584.427 2022-04-01  Total Dutch airports           5140680
52    39185.430 2022-05-01  Total Dutch airports           6092054
53    82594.432 2022-06-01  Total Dutch airports           6118527
54   160921.573 2022-07-01  Total Dutch airports           6211931
55    56599.998 2022-08-01  Total Dutch airports           6378969
Correlation at Total Dutch airports is: 
                  New Cases  Total passengers
New Cases          1.000000          0.119809
Total passengers   0.119809          1.000000
 
      New Cases    Periods                    Airports  Total passengers
26    10656.001 2020-03-01  Amsterdam Airport Schiphol           2476372
27    27924.714 2020-04-01  Amsterdam Airport Schiphol            126015
28     7582.998 2020-05-01  Amsterdam Airport Schiphol            207827
29     4043.568 2020-06-01  Amsterdam Airport Schiphol            471410
30     3634.429 2020-07-01  Amsterdam Airport Schiphol           1338857
31    16229.146 2020-08-01  Amsterdam Airport Schiphol           1854786
32    45306.571 2020-09-01  Amsterdam Airport Schiphol           1337741
33   216295.287 2020-10-01  Amsterdam Airport Schiphol           1143483
34   182778.574 2020-11-01  Amsterdam Airport Schiphol            900434
35   266188.860 2020-12-01  Amsterdam Airport Schiphol           1233043
36   191199.141 2021-01-01  Amsterdam Airport Schiphol            869129
37   109028.142 2021-02-01  Amsterdam Airport Schiphol            505194
38   179947.141 2021-03-01  Amsterdam Airport Schiphol            660176
39   222759.287 2021-04-01  Amsterdam Airport Schiphol            786652
40   162576.713 2021-05-01  Amsterdam Airport Schiphol           1106740
41    40344.716 2021-06-01  Amsterdam Airport Schiphol           1678265
42   174610.284 2021-07-01  Amsterdam Airport Schiphol           3029951
43    78988.999 2021-08-01  Amsterdam Airport Schiphol           3786973
44    63854.573 2021-09-01  Amsterdam Airport Schiphol           3370205
45   116907.427 2021-10-01  Amsterdam Airport Schiphol           3745991
46   482635.572 2021-11-01  Amsterdam Airport Schiphol           3095823
47   505056.000 2021-12-01  Amsterdam Airport Schiphol           2855711
48  1177889.571 2022-01-01  Amsterdam Airport Schiphol           2488083
49  1987987.427 2022-02-01  Amsterdam Airport Schiphol           2660676
50  1514981.857 2022-03-01  Amsterdam Airport Schiphol           3732048
51   264584.427 2022-04-01  Amsterdam Airport Schiphol           4434587
52    39185.430 2022-05-01  Amsterdam Airport Schiphol           5217035
53    82594.432 2022-06-01  Amsterdam Airport Schiphol           5232630
54   160921.573 2022-07-01  Amsterdam Airport Schiphol           5179725
55    56599.998 2022-08-01  Amsterdam Airport Schiphol           5327361
Correlation at Amsterdam Airport Schiphol is: 
                  New Cases  Total passengers
New Cases          1.000000          0.136939
Total passengers   0.136939          1.000000
 
      New Cases    Periods                     Airports  Total passengers
26    10656.001 2020-03-01  Rotterdam The Hague Airport             62870
27    27924.714 2020-04-01  Rotterdam The Hague Airport                 0
28     7582.998 2020-05-01  Rotterdam The Hague Airport               134
29     4043.568 2020-06-01  Rotterdam The Hague Airport              7971
30     3634.429 2020-07-01  Rotterdam The Hague Airport             78468
31    16229.146 2020-08-01  Rotterdam The Hague Airport             74047
32    45306.571 2020-09-01  Rotterdam The Hague Airport             32047
33   216295.287 2020-10-01  Rotterdam The Hague Airport             21811
34   182778.574 2020-11-01  Rotterdam The Hague Airport              4761
35   266188.860 2020-12-01  Rotterdam The Hague Airport              4590
36   191199.141 2021-01-01  Rotterdam The Hague Airport              3311
37   109028.142 2021-02-01  Rotterdam The Hague Airport              2871
38   179947.141 2021-03-01  Rotterdam The Hague Airport                98
39   222759.287 2021-04-01  Rotterdam The Hague Airport              1945
40   162576.713 2021-05-01  Rotterdam The Hague Airport              8912
41    40344.716 2021-06-01  Rotterdam The Hague Airport             39309
42   174610.284 2021-07-01  Rotterdam The Hague Airport            113882
43    78988.999 2021-08-01  Rotterdam The Hague Airport            181957
44    63854.573 2021-09-01  Rotterdam The Hague Airport            167169
45   116907.427 2021-10-01  Rotterdam The Hague Airport            147368
46   482635.572 2021-11-01  Rotterdam The Hague Airport             48278
47   505056.000 2021-12-01  Rotterdam The Hague Airport             40295
48  1177889.571 2022-01-01  Rotterdam The Hague Airport             58903
49  1987987.427 2022-02-01  Rotterdam The Hague Airport             63510
50  1514981.857 2022-03-01  Rotterdam The Hague Airport            101163
51   264584.427 2022-04-01  Rotterdam The Hague Airport            139308
52    39185.430 2022-05-01  Rotterdam The Hague Airport            224714
53    82594.432 2022-06-01  Rotterdam The Hague Airport            224069
54   160921.573 2022-07-01  Rotterdam The Hague Airport            312468
55    56599.998 2022-08-01  Rotterdam The Hague Airport            305371
Correlation at Rotterdam The Hague Airport is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.073068
Total passengers  -0.073068          1.000000
 
      New Cases    Periods           Airports  Total passengers
26    10656.001 2020-03-01  Eindhoven Airport            225071
27    27924.714 2020-04-01  Eindhoven Airport              7732
28     7582.998 2020-05-01  Eindhoven Airport             12108
29     4043.568 2020-06-01  Eindhoven Airport             46774
30     3634.429 2020-07-01  Eindhoven Airport            257515
31    16229.146 2020-08-01  Eindhoven Airport            295053
32    45306.571 2020-09-01  Eindhoven Airport            171375
33   216295.287 2020-10-01  Eindhoven Airport            133057
34   182778.574 2020-11-01  Eindhoven Airport             57737
35   266188.860 2020-12-01  Eindhoven Airport             66544
36   191199.141 2021-01-01  Eindhoven Airport             36128
37   109028.142 2021-02-01  Eindhoven Airport             11314
38   179947.141 2021-03-01  Eindhoven Airport             16000
39   222759.287 2021-04-01  Eindhoven Airport             27805
40   162576.713 2021-05-01  Eindhoven Airport             51798
41    40344.716 2021-06-01  Eindhoven Airport            147608
42   174610.284 2021-07-01  Eindhoven Airport            344808
43    78988.999 2021-08-01  Eindhoven Airport            481576
44    63854.573 2021-09-01  Eindhoven Airport            453527
45   116907.427 2021-10-01  Eindhoven Airport            479966
46   482635.572 2021-11-01  Eindhoven Airport            341640
47   505056.000 2021-12-01  Eindhoven Airport            306254
48  1177889.571 2022-01-01  Eindhoven Airport            275066
49  1987987.427 2022-02-01  Eindhoven Airport            309283
50  1514981.857 2022-03-01  Eindhoven Airport            401775
51   264584.427 2022-04-01  Eindhoven Airport            546389
52    39185.430 2022-05-01  Eindhoven Airport            619540
53    82594.432 2022-06-01  Eindhoven Airport            631700
54   160921.573 2022-07-01  Eindhoven Airport            662646
55    56599.998 2022-08-01  Eindhoven Airport            678848
Correlation at Eindhoven Airport is: 
                  New Cases  Total passengers
New Cases          1.000000          0.086192
Total passengers   0.086192          1.000000
 
      New Cases    Periods                   Airports  Total passengers
26    10656.001 2020-03-01  Maastricht Aachen Airport              7242
27    27924.714 2020-04-01  Maastricht Aachen Airport                 5
28     7582.998 2020-05-01  Maastricht Aachen Airport                 4
29     4043.568 2020-06-01  Maastricht Aachen Airport               389
30     3634.429 2020-07-01  Maastricht Aachen Airport             12952
31    16229.146 2020-08-01  Maastricht Aachen Airport             16818
32    45306.571 2020-09-01  Maastricht Aachen Airport              5511
33   216295.287 2020-10-01  Maastricht Aachen Airport              4710
34   182778.574 2020-11-01  Maastricht Aachen Airport              2139
35   266188.860 2020-12-01  Maastricht Aachen Airport              1841
36   191199.141 2021-01-01  Maastricht Aachen Airport              1049
37   109028.142 2021-02-01  Maastricht Aachen Airport               448
38   179947.141 2021-03-01  Maastricht Aachen Airport               373
39   222759.287 2021-04-01  Maastricht Aachen Airport              1474
40   162576.713 2021-05-01  Maastricht Aachen Airport              2223
41    40344.716 2021-06-01  Maastricht Aachen Airport              4454
42   174610.284 2021-07-01  Maastricht Aachen Airport             22399
43    78988.999 2021-08-01  Maastricht Aachen Airport             24199
44    63854.573 2021-09-01  Maastricht Aachen Airport             16364
45   116907.427 2021-10-01  Maastricht Aachen Airport             17826
46   482635.572 2021-11-01  Maastricht Aachen Airport              3744
47   505056.000 2021-12-01  Maastricht Aachen Airport              3093
48  1177889.571 2022-01-01  Maastricht Aachen Airport              5880
49  1987987.427 2022-02-01  Maastricht Aachen Airport              3288
50  1514981.857 2022-03-01  Maastricht Aachen Airport              3371
51   264584.427 2022-04-01  Maastricht Aachen Airport             15386
52    39185.430 2022-05-01  Maastricht Aachen Airport             22019
53    82594.432 2022-06-01  Maastricht Aachen Airport             20728
54   160921.573 2022-07-01  Maastricht Aachen Airport             45778
55    56599.998 2022-08-01  Maastricht Aachen Airport             53999
Correlation at Maastricht Aachen Airport is: 
                  New Cases  Total passengers
New Cases          1.000000         -0.211452
Total passengers  -0.211452          1.000000
 
      New Cases    Periods                 Airports  Total passengers
26    10656.001 2020-03-01  Groningen Airport Eelde              1999
27    27924.714 2020-04-01  Groningen Airport Eelde                 0
28     7582.998 2020-05-01  Groningen Airport Eelde                47
29     4043.568 2020-06-01  Groningen Airport Eelde                 0
30     3634.429 2020-07-01  Groningen Airport Eelde              2723
31    16229.146 2020-08-01  Groningen Airport Eelde              2231
32    45306.571 2020-09-01  Groningen Airport Eelde               589
33   216295.287 2020-10-01  Groningen Airport Eelde                62
34   182778.574 2020-11-01  Groningen Airport Eelde                 0
35   266188.860 2020-12-01  Groningen Airport Eelde                 0
36   191199.141 2021-01-01  Groningen Airport Eelde                 0
37   109028.142 2021-02-01  Groningen Airport Eelde                 0
38   179947.141 2021-03-01  Groningen Airport Eelde                 0
39   222759.287 2021-04-01  Groningen Airport Eelde                 0
40   162576.713 2021-05-01  Groningen Airport Eelde                 0
41    40344.716 2021-06-01  Groningen Airport Eelde               694
42   174610.284 2021-07-01  Groningen Airport Eelde              4119
43    78988.999 2021-08-01  Groningen Airport Eelde              4475
44    63854.573 2021-09-01  Groningen Airport Eelde              6212
45   116907.427 2021-10-01  Groningen Airport Eelde              4794
46   482635.572 2021-11-01  Groningen Airport Eelde              3455
47   505056.000 2021-12-01  Groningen Airport Eelde              3511
48  1177889.571 2022-01-01  Groningen Airport Eelde              3666
49  1987987.427 2022-02-01  Groningen Airport Eelde              3436
50  1514981.857 2022-03-01  Groningen Airport Eelde              3306
51   264584.427 2022-04-01  Groningen Airport Eelde              5010
52    39185.430 2022-05-01  Groningen Airport Eelde              8746
53    82594.432 2022-06-01  Groningen Airport Eelde              9400
54   160921.573 2022-07-01  Groningen Airport Eelde             11314
55    56599.998 2022-08-01  Groningen Airport Eelde             13390
Correlation at Groningen Airport Eelde is: 
                  New Cases  Total passengers
New Cases          1.000000          0.014651
Total passengers   0.014651          1.000000
 
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

Conclusion¶

The research question of this report was: ‘How did Covid-19 affect the passenger air traffic in the Netherlands?’. For answering the research question, four sub questions have been identified.

The first sub-question was as follows: ‘How was the number of new Covid-19 cases developed in the considered time in the Netherlands?’. The hypothesis, that the development of new Covid-19 cases is dependent on seasonality and government regulations, has been confirmed. Analysis of the new Covid-19 cases showed that the number of cases tended to decrease during summer and increase during winter. Analysis of the new cases in relation to the regulations showed that after stricter government regulations, the number of cases first slightly increased, followed by a decrease.

The second sub-question was: ‘How was the number of air traffic passengers developed in the considered time and spatial scope?’ The associated hypothesis was that it was related to government regulations for Covid-19. This hypothesis is confirmed. The biggest drop in passengers occurred in February-March 2020, corresponding to the introduction of a no-fly zone. Other significant movements in number of passengers can also be explained by the active measures at the time.

The third sub-question conducted in order to answer the research question was: ‘Are there relative differences in the development of air traffic passengers between the considered airports in the Netherlands?’. The hypothesis was that there will be only small differences in 2019 compared to 2018. Given the impactful measures around February/March 2020, a large drop in passenger numbers, equally felt by all airports, is expected. In addition, it is expected that airports with a relatively high number of local flights will ultimately have been affected the least, as they are less dependent on restrictions related to international travel. The analysis showed that the total number of air passengers in the Netherlands is currently at 82% of pre-COVID levels. The number of passengers at Rotterdam The Hague Airport, Eindhoven Airport and Maastricht Aachen Airport are currently even above pre-COVID levels. However, against expectations, Groningen Airport Eelde has experienced the largest decrease in passenger numbers (currently at 47% of pre-COVID levels). Therefore, the hypothesis is rejected.

Finally the last sub-question was answered: ‘How has Covid-19 impacted air traffic from and to various regions / continents?’. The hypothesis was that the number of air passengers on intercontinental flights has been more affected than the number of passengers on European flights. The hypothesis is partly confirmed as the effect on European flights compared to intercontinental flights varied over time. This could be explained by regular bans on flights to specific parts of the world as well as parts of Europe and changing consumer preferences (e.g. increased preference for intercontinental travel after COVID-19). It is also notable that, at this moment, Europe is further down pre-COVID levels than Africa and South/Middle America. Therefore, the hypothesis is partly confirmed.

After answering the sub questions, a correlation test has been performed. The correlations that were found are not representative for the relationship between the COVID-19 cases and number of air passengers. Therefore, these have not been taken into account for answering the research question.

It can be concluded that COVID-19 significantly affected passenger air traffic. Government measures directly impacted the number of air passengers and therefore passenger air traffic collapsed at the beginning of COVID-19. Recovery is ongoing with the total Dutch air passenger traffic currently at 82% of pre-Covid levels. Interestingly, air traffic related to Asia clearly lags behind in recovery. Also, Europe is currently behind the Americas and Africa.

Discussion¶

In this section, the discussion points will be discussed to evaluate the feasibility and reliability of the research. First, the COVID-19 cases at the beginning of the pandemic were unknown or unreliable in the Netherlands. Especially in the time February 2020, when the first infection occurred, until June 2020. Not until June it was possible for every citizen with symptoms to take a test. Thus, before this time, not all the positive tests were registered. This should be contemplated when considering the data on COVID-19 infections available. However, this is not included in measuring the correlation and is therefore not very reliable.

Secondly, although the effect of seasonality is included within the discussions of analyzing the graphs, it was not possible to include this in measuring the correlation since this is purely based on hard data. During summertime people will tend to travel more and the infections will tend to be less. Therefore, this will yield conflicting results when it comes to correlation.

The external factors outside the scope are last discussion points that should be considered. Aspects like high costs of flights, inflation, recession, ethics and fear of COVID-19 or personnel shortages are features that play a role in the amount of air traffic passengers in the Netherlands. Especially the fear of COVID-19, ethics and opinions of others have been reasons for a large amount of people not to travel. Moreover, for example people that have lost their jobs during COVID times, might have changed their travel behavior as well. These are also aspects that affect the results on amount of air traffic passengers a lot and should be considered in the conclusion.

Contribution Statement¶

Eva Lijnen: Subquestion 2, overall text writing, references, discussion.

Chaja Schwab: Subquestion 1 and 4, conclusion.

Willemijn Dietz: Subquestion 2, 3 and 4, correlation.

Veerle van Citters: Subquestion 3, overall text writing, discussion.

Noa Zijlmans: Subquestion 1 and 4, overall PEP-8 check, conclusion.

References and Data Used¶

Centraal Bureau voor de Statistiek. (2019, June 28). Lichte groei aantal passagiers Nederlandse luchthavens. Retrieved from https://www.cbs.nl/nl-nl/nieuws/2019/26/lichte-groei-aantal-passagiers-nederlandse-luchthavens

Centraal Bureau voor de Statistiek. (2022, November 8). Aviation; monthly figures of Dutch airports. Retrieved from https://opendata.cbs.nl/statline/#/CBS/en/dataset/37478eng/table?ts=1664959088541

Mathieu, E. , Ritchie, H., Rodés-Guirao, L., Appel, C., Giattino, C., Hasell, J., Macdonald, B., Dattani, S., Beltekian, D., Ortiz-Ospina, E., and Roser, M. (2020) - "Coronavirus Pandemic (COVID-19)". Published online at OurWorldInData.org. Retrieved from 'https://ourworldindata.org/coronavirus'

Ministerie van Algemene Zaken. (2022, September 26). Januari 2020: Eerste signalen corona. Coronavirus Tijdlijn | Rijksoverheid.nl. Retrieved from https://www.rijksoverheid.nl/onderwerpen/coronavirus-tijdlijn/januari-2020-eerste-signalen-corona

Ministerie van Algemene Zaken (2022, June 14). Ontwikkelingen coronavirus in 2022 - Coronavirus tijdlijn - Rijksoverheid.nl. Retrieved from Www.rijksoverheid.nl. https://www.rijksoverheid.nl/onderwerpen/coronavirus-tijdlijn/2022

NOS. (2022, January 6). Die duizenden lege vluchten zijn volgens luchthavenkoepel helemaal niet nodig. NOS.nl. Retrieved from https://nos.nl/artikel/2412154-die-duizenden-lege-vluchten-zijn-volgens-luchthavenkoepel-helemaal-niet-nodig

Regionale luchthavens. (n.d.). Toekomst Luchtvaart. Retrieved from https://www.luchtvaartindetoekomst.nl/luchthavens/regionale+luchthavens/default.aspx

RIVM. (n.d.). Tijdlijn van coronamaatregelen. Retrieved from https://www.rivm.nl/gedragsonderzoek/tijdlijn-maatregelen-covid

Appendix - Overview COVID-19 Regulations Related to Air Traffic¶

Below, an extensive overview of COVID-19 regulations, between February 2020 until May 2022, is described (Ministerie van Algmenene Zaken, 2022). There will only be focused on flights/ airport regulations.

  • February 2020: first COVID-19 infection in the Netherlands, increase in infections in Netherlands and the rest of Europe.
  • Beginning of March 2020: more infections in the Netherlands, first regulations on flights: temporary ban on passenger flights from risk areas (Italy, China, South Korea, and Iran).
  • Mid-March 2020: no-fly zone to the BES-island and the following countries: UK, Norway, Switzerland, Iceland, and border closure for people from out of Europe.
  • End of March 2020: Extension no fly zone to Austria.
  • Begin of April 2020: only a limited number of flights are taking place, mostly repatriation flights, mandatory health certificate for all travelers coming from high-risk areas.
  • Mid-May 2020: Extension ban on BES-islands flights.
  • Mid-June 2020: Extension mandatory health certificate for all travelers coming from high-risk areas, mandatory face masks for passenger flights, extension ban on flights from out of Europe, possible to travel within Europe again.
  • Begin July 2020: ban for travelers from the following countries: Algeria, Australia, Canada, Georgia, Japan, Montenegro, Morocco, New Zealand, Rwanda, Serbia, South Korea, Thailand, Tunisia, Uruguay.
  • End July 2020: extension ban on flights to BES-islands.
  • August-November 2020: it is still discouraged to travel to red/ orange-colored countries, call for only necessary trips.
  • December 2020: Extension ban on flights to BES-islands, no travel advice until mid-March, mandatory negative test result from travelers from high-risk areas.
  • January 2021: negative test result necessary to BES-islands and ban on flights to UK, South Africa, and South America.
  • February 2021: extension ban on flight to BES-islands
  • March, April 2021: Allowed again to travel to the UK, flight bans on air traffic from South Africa, Dominican Republic, Brazil, Argentina, Bolivia, Chile, Colombia, Ecuador, French Guiana, Guyana, Panama, Paraguay, Peru, Suriname, Uruguay, and Venezuela.
  • May 2021: extension flight bans on air traffic from the United Kingdom, South Africa, Dominican Republic, Brazil, Argentina, Bolivia, Cape Verde, Chile, Colombia, Ecuador, French Guiana, Guyana, Panama, Paraguay, Peru, Suriname, Uruguay, and Venezuela until June 1, 2021.
  • May 2021: travel to countries with low levels of infection will again be possible.
  • June 2021: air traffic from above mentioned countries is possible again.
  • July 2021: possible to travel within EU with negative test result, vaccination, or proof of recovery
  • End of 2021: ban on flights from South Africa, Lesotho, Eswatini, Botswana, Namibia, and Zimbabwe, because of the Omicron variant of COVID-19.
  • End December 2021: lifting of ban on flights to the above-mentioned countries.
  • February 2022: necessary corona certificate, based on a vaccination/ recovery and modified rules for travelers to the Netherlands from an EU/Schengen country, traveling to countries outside Europe is no longer disallowed.
  • March- May 2022: most of the regulations are withdrawn.